链表的添加和删除

单链表中,在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  


 

有一点很重要

比如我随便画一个。。

 

千万别也成

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

正确的是

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

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

 

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

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

2.当j<i时,就遍历链表,让p的指针向后移动,不断指向下一结点,j累加1;

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. }  
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值