线性表-链表(二)

一,单链表的插入
(1)单链表如何插入一个新元素呢?
在单链表中
有序对:
这里写图片描述 变成 这里写图片描述
图例:
这里写图片描述
注意:在单链表中插入只需要修改指针。若要在第 i 个结点之前插入元素,修改的是是第 (i-1) 个结点的指针。
(2)单链表的插入元素的代码怎么写呢?
代码如下:

    Status ListInsert(LinkList &L, int i ,ElemType e){
           p=L;
           j=0;
           while(p && j<i-1){
              p=p->next;
              ++j;
           }
           if(p && j==i-1){
               s=(LinkList)malloc(sizeof(LNode));
               s->data=e;
               s->next=p->next;
               p->next=s;
               return OK;
           }else{
               return ERROR;
           }
    }

分析:在上面这个单链表插入元素这个算法中,L为带头结点的单链表的头指针,在链表中第 i 个结点之前插入新的元素 e 。while循环的作用是,寻找第(i-1)个结点。

核心算法:
生成新结点s
s=(LinkList)malloc(sizeof(LNode));
为新节点s赋值
s->data=e;
让s 的next域指向 p 的next域,p就和ai 建立联系
s->next=p->next;
让p next域指向 s 的next域,p又和s 建立了联系
p->next=s;
成功插入新节点 e

图例:
这里写图片描述

二,单链表的删除
(1)单链表如何插入一个新元素呢?
在单链表中
有序对:
这里写图片描述变成 这里写图片描述
图例:
这里写图片描述
注意:在单链表中删除第 i 个结点时,要到单链表中第(i-2)个结点,修改其指向后继的指针。
(2)单链表的删除元素的代码怎么写呢?
代码如下:

    Status ListDelete(LinkList &L, int i ,ElemType &e){
           p=L;
           j=0;
           while(p->next && j<i-1){
              p=p->next;
              ++j;
           }
           if(p->next && j==i-1){
               q=p->next;
               p->next=q->next;
               e=q->next;
               free(q);
               return OK;
           }else{
               return ERROR;
           }
    }

分析:在上面这个单链表删除元素这个算法中,L为带头结点的单链表的头指针,在单链表中删除第 i 个结点元素 。while循环的作用是,寻找第(i-1)个结点,并且让 p 指向它

核心算法:
让 q 指向 p 的 next域,防止链的断裂,一旦断裂,后面的元素就找不到了
q=p->next;
让 p 指向 q 的next域,其实 p指向的也是是 p 的next 的 next 域
p->next=q->next;
让 e 存储 q指向的元素的值,也就是我们要删除的值,为了安全,我们先要删除的这个值保存起来,防止以后使用
e=q->next;
清空结点 q 的内存
free(q);
return OK;
图例:
这里写图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北顾丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值