【数据结构】顺序表、单链表、循环链表的插入与删除

您所在的位置:网站首页 数据结构顺序表的基本运算方法 【数据结构】顺序表、单链表、循环链表的插入与删除

【数据结构】顺序表、单链表、循环链表的插入与删除

2024-06-13 13:41| 来源: 网络整理| 查看: 265

写在前面的顺序表 插入删除定位 单链表 插入删除 双向循环链表 删除插入 总结

写在前面的

       在复习数据结构的过程中对于链表的操作总是容易忘记,时不时的就不知道具体的该怎么操作了,所以把这几个比较细节的地方总结一下,让自己印象加深一下,给之后的学习做个参考。

        接下来主要总结一下单链表和循环链表的插入与删除的方法和具体的代码。导图如下 这里写图片描述

顺序表 插入

步骤:首先将节点依次向后移动一个元素的位置,这样空出第i个数据元素的位置;然后将数据x插入这个位置,最后表长加1.

算法如下:

void InsertSeqlist(SeqList L,DataType x,int i) { //将元素x插入到顺序表L的第i个数据元素之前 if(L.length==Maxsize) exit("该链表已满!"); if(iL.length + 1) exit("插入非法位置!"); for(j=L.length,j>=i;j--) { L.data[j]=L.data[j-1]; //依次后移 } L.data[i-1]=x; //将x插入到下标为i-1的位置 L.length++; //表长加1 }

图例解释:

这里写图片描述

元素挪动位置之后:

这里写图片描述

最后插入:

这里写图片描述

删除

步骤:节点依次向左移动一个元素位置;表长度减一。与插入不同的是,此处无需考虑溢出,只需判断参数i是否合法即可。

算法如下:

void DeleteSeqList(SeqList L, int i) { //删除线性表L中第i个结点 if(iL.length) exit("非法位置!"); for(j=i; jnext; //新街点链指向*q的后继节点 q->next=p; //修改*q的链域 } } "链接操作p->next=q->next 和 q->next=p 两条语句的执行顺序不能颠倒,否则结点*q的链域值(指向原表第i个结点的指针)将丢失" 删除

步骤:给定一个值i,将链表中第i个结点从链表中移除,并修改相关结点的指针,以维持剩余结点的链接关系。

导图如下: 这里写图片描述

算法如下:

void DeleteLinklist(LinkList head, int i) { Node *q; if (i==1) q=head; else q=GetLinklist(head, i-1); //先找待删除节点的直接前驱 if(q!=NULL && q->next!=NULL) //若直接前驱存在切待删除结点存在 { p=q->next; //p指向待删除结点 q->next=p->next; //移除待删除结点 free(p); //释放已移除的结点p的空间 } else exit("找不到要删除的结点!") } 双向循环链表 删除 由于双向链表存在指针prior以及next所以操作起来相对于其他形式的表复杂一些,基本的语法如下: p->prior->next=p->next; //p前驱结点的后链指向p的后继结点 p->next->prior=p->prior; //p后继节点的前链指向p的前驱结点 free(p); //释放*p的空间 "前两行的语句可以颠倒"

导图如下: 这里写图片描述

插入 基本语法如下: t->prior=p; t->next=p->next; p->next->prior=t; p->next=t; 导图如下: 这里写图片描述 总结 通过对数据结构中链表操作的总结,可以非常明显的看出在具体的交换中表中的指针究竟是怎样“运动”的。而且对于指针运动的顺序一定要明确,否则整个链表就非常容易丢失,细节决定成败!


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3