链表的添加和删除

单链表中,在C语言可以用结构体指针描述:

[cpp]  view plain  copy
  1. typedef struct Node  
  2. {  
  3.     ElemType data;  
  4.     struct Node * next; //p->data,p->next->data  
  5. }Node;  
  6. typedef struct Node * LinkList  


 

有一点很重要

比如我随便画一个。。

链表的添加和删除_第1张图片

 

千万别也成

p->next=s;s->netx=p->next;

正确的是

s->netx=p->next;p->next=s;

自己好好想想,不打了。记得是逆序就行了~

 

好,进入正题,单链表第i个数据插入节点的算法思路:

1.声明一节点p指向链表第一个结点,初始化j从1开始;

2.当j

3.若到链表末尾p为空,则说明第i个元素不存在;

4.否则查找成功,在系统中生成一个空节点s;

5.将数据元素e赋给s->data;

6.单链表插入标准语句s->next=p->next;p->next=s;

7.返回成功。

实现代码算法如下:

[cpp]  view plain  copy
  1. //在L中第i个位置之前插入新的数据元素e,L的长度加1  
  2. int ListInsert(LinkList *L,int i,ElmeType e)  
  3. {  
  4.     int j;  
  5.     LinkList p,s;  
  6.     p = *L;  
  7.     j = 1;  
  8.     while(p && j<1)  
  9.     {  
  10.         p = p->next;  
  11.         ++j;  
  12.     }  
  13.     if(!p || j>=1)  
  14.         return ERROR;  
  15.     s = (LinkList)malloc(sizeof(Node)); //生成新节点  
  16.     s->data = e;  
  17.     s->next = p->next;  
  18.     p->next = s; //顺序绝对不变  
  19.     return OK;  
  20. }  


 

 

如何删除呢?其实只要q=p->next;p->next->q->next;

算法思路省略,直接给出代码:

[cpp]  view plain  copy
  1. //删除L第i个元素,并用e返回其值,L的长度减1  
  2. int ListInsert(LinkList *L,int i,ElmeType e)  
  3. {  
  4.     int j;  
  5.     LinkList p,s;  
  6.     p = *L;  
  7.     j = 1;  
  8.     while(p && j<1)  
  9.     {  
  10.         p = p->next;  
  11.         ++j;  
  12.     }  
  13.     if(!(p->next) || j>=1)  
  14.         return ERROR;  
  15.     q = p->next;  
  16.     p->next = q->next;  
  17.     *e = q->data;  
  18.     free(q);    //释放内存  
  19.     return OK;  
  20. }  

你可能感兴趣的:(链表的添加和删除)