【数据结构】顺序表、单链表、循环链表的插入与删除
2016-09-19 23:05
399 查看
写在前面的
顺序表
插入
删除
定位
单链表
插入
删除
双向循环链表
删除
插入
总结
接下来主要总结一下单链表和循环链表的插入与删除的方法和具体的代码。导图如下
算法如下:
图例解释:
元素挪动位置之后:
最后插入:
算法如下:
算法如下:
导图如下:
算法如下:
导图如下:
算法如下:
导图如下:
导图如下:
顺序表
插入
删除
定位
单链表
插入
删除
双向循环链表
删除
插入
总结
写在前面的
在复习数据结构的过程中对于链表的操作总是容易忘记,时不时的就不知道具体的该怎么操作了,所以把这几个比较细节的地方总结一下,让自己印象加深一下,给之后的学习做个参考。接下来主要总结一下单链表和循环链表的插入与删除的方法和具体的代码。导图如下
顺序表
插入
步骤:首先将节点依次向后移动一个元素的位置,这样空出第i个数据元素的位置;然后将数据x插入这个位置,最后表长加1.算法如下:
void InsertSeqlist(SeqList L,DataType x,int i) { //将元素x插入到顺序表L的第i个数据元素之前 if(L.length==Maxsize) exit("该链表已满!"); if(i<1 || i>L.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(i<1 || i>L.length) exit("非法位置!"); for(j=i; j<L.length; j++) //第i个元素的下角标为i-1 { L.data[j-1]=L.data[j]; //依次左移 } L.length--; }
定位
算法描述:i从0开始,作为扫描顺序表的下表。如果表中有一个节点的值等于x,或i等于L.length,则终止循环。如果循环终止于i=L.length,则未找到x,返回0,否则返回x的位置。算法如下:
int LocateSeqList(SeqList L, DataType x) { int i=0; while((i<L.length) && (L.data[i]!=x)) //在顺序表中查找值为x的节点 { i++; } if(i<L.length) return i+1; else return 0; }
单链表
插入
步骤:将给定的x的元素插入到链表的第i个节点之前。首先找到链表的第i-1个节点q,然后,生成一个值为x的新节点p,p的指针指向q的直接后继点,q的指针指向p,这样就完成了单链表的插入运算。导图如下:
算法如下:
void InsertLinklist(LinkList head, DataType x, int i) { Node *p,*q; if(i==1) q=head; else q=GetLinklist(head,i-1); //找到第i-1 个数据元素节点 if(q==NULL) exit("找不到插入的位置!"); //第i-1个节点不存在 else { p=malloc(sizeof(Node)); p->data=x; //生成新节点 p->next=q->next; //新街点链指向*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;
导图如下:
总结
通过对数据结构中链表操作的总结,可以非常明显的看出在具体的交换中表中的指针究竟是怎样“运动”的。而且对于指针运动的顺序一定要明确,否则整个链表就非常容易丢失,细节决定成败!相关文章推荐
- 数据结构--双向循环链表--插入和删除
- 数据结构作业代码保存-2.1 单向循环链表的建立,插入和删除,和指针移动
- 【程序员面试宝典】数据结构基础二单链表循环链表的操作 建立|插入删除|打印|合并
- 数据结构:头插法、尾插法创建单链表,求链表长度、查找、插入、删除、合并
- 【数据结构】单链表(一)单链表的定义,插入,删除和查找操作
- 数据结构之单链表(尾插法)查找、插入和删除
- 【程序员面试宝典】数据结构基础一单链表:创建|求长|插入|删除|排序|打印|逆置
- 算法学习-数据结构之链表操作,创建,插入,删除,查找。
- [数据结构]顺序单链表插入
- 数据结构——10 双向链表插入和删除节点
- C++ 数据结构的单链表的建立,插入,删除操作
- 数据结构之链表(头指针链表的插入、删除、逆序)
- [数据结构]顺序单链表插入
- 数据结构二(顺序表 & 链表;循环及无头循环链表 & 链栈 )
- 数据结构之顺序表,插入,删除等
- C语言之数据结构的顺序单链表创建,插入和删除操作
- 数据结构学习二 数据结构之链表图解版【创建,遍历,删除,插入】
- 数据结构 单链表插入删除操作(c语言实现)
- 数据结构——2 单链表插入和删除节点
- 数据结构之线性表的顺序结构操作2-(删除,插入,查值等)