现在的位置: 首页 > 综合 > 正文

单链表的基本操作(个人总结)

2012年12月09日 ⁄ 综合 ⁄ 共 2213字 ⁄ 字号 评论关闭

//单链表的基本操作
#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
typedef int ElemType;
//单链表结构
typedef struct Node
{
 ElemType data;
 struct Node *data;
}Node,*LinkList;
//初始化
LinkList LinkListInit()
{
  Node *L;
  L=(LinkList)malloc(sizeof(Node));
  if(L==NULL) return ERROR;
 
  L->next=NULL;
}
//Head法建立单链表
LinkList LinkListCreatHead()
{
  Node *L;
  L=(LinkList)malloc(sizeof(Node));
  L->next=NULL;
  ElemType x;
  while(scanf("%d",&x)!=EOF)
  {
    Node *p;
    p=(LinkList)malloc(sizeof(Node));
    p->data=x;
    p->next=L->next; 
    L->next=p;
  }
  return L;
}
//Tail法建立单链表
LinkList LinkListCreatTail()
{
  Node *L;
  L=(LinkList)malloc(sizeof(Node));
  L->next=NULL;
  Node *r;
  r=L;
  ElemType x;
  while(scanf("%d",&x)!=NULL)
  {
   Node *p;
   p=(LinkList)malloc(sizeof(Node));
   p->data=x;
   r->next=L;
   r=p;
  }
  r->next=NULL;
 return L;
}
//单链表的插入将x插入到i位置上
LinkedList LinkedListInsert(LinkedList L,int i,ElemType x) 

    Node *pre;                      //pre为前驱结点  
    pre = L; 
    int tempi = 0; 
    for (tempi = 1; tempi < i; tempi++) 
        pre = pre->next;                 //查找第i个位置的前驱结点  
    Node *p;                                //插入的结点为p 
    p = (Node *)malloc(sizeof(Node)); 
    p->data = x;  
    p->next = pre->next; 
    pre->next = p; 
     
    return L;                            
}  
 
////////////////////////////////////////////  
 
//单链表的删除,在链表中删除值为x的元素 
 
LinkedList LinkedListDelete(LinkedList L,ElemType x) 

    Node *p,*pre;                   //pre为前驱结点,p为查找的结点。  
    p = L->next; 
    while(p->data != x)              //查找值为x的元素  
    {    
        pre = p;  
        p = p->next; 
    } 
    pre->next = p->next;          //删除操作,将其前驱next指向其后继。  
    free(p); 
    return L; 
}  
//单链表的清除 
void LinkListClear(LinkList L)
{
 Node *p,*q;
 p=L->next;
  while(p!=NULL)
 {
   q=p->next;
   free(p);
   p=q;
 }
 L->next=NULL;
}
//单链表的输出
LinkList LinkListPrint(LinkList L)
{
 Node *p;
 for(p=L->next;p!=NULL;p=p->next)
{ printf("%d",p->data);
 }
 
}
//删除单链表中相同的元素
LinkList LinkListDelsame(LinkList L)
{
 Node *pre,*p,*pnext;
 p=L->next;
 pre=L;pnext=p->next;
 while(pnext!=NULL)     //I worked hard two days!I am very very happy !
  {
    if(p->data==pnext->data) {pre->next=p->next;free(p);p=pnext;pnext=pnext->next;}
  else { pre=pre->next;p=pnext;  pnext=pnext->next; }
  }

 return L;
}
//单链表的逆置
LinkedList LinkedListInverse(LinkedList L)
{
 Node *p,*q;
 p=L->next;
 L->next=NULL;
while(p!=NULL)
{
 q=p->next;
 p->next=L->next;
 L->next=p;
 p=q;
}
return L;
}

抱歉!评论已关闭.