当前位置:   article > 正文

删除单链上数据域值最小的节点_数据结构考研笔记(十)线性表之双链表、循环链表、静态链表、单链表和顺序表的区别以及最值、合并、逆置操作。...

删除双向链表中具有最小值的节点

文字:独木

排版:独木

图片:独木

98ea607ee1f7703980c10430af31336b.png

a97c2d2e8212ed18c4a872d5f870e28c.gif

— 往期回顾 —

数据结构考研学习笔记(二)---顺序表应用

96d026d0ec025a1842948b87ac7316a3.png

数据结构考研学习笔记(一)—顺序表基本操作:插入 查询 删除

96d026d0ec025a1842948b87ac7316a3.png

数据结构考研学习笔记之线性表应用题

96d026d0ec025a1842948b87ac7316a3.png

数据结构考研笔记之线性表

96d026d0ec025a1842948b87ac7316a3.png

数据结构考研学习笔记(九)---树、森林

96d026d0ec025a1842948b87ac7316a3.png

线性表

  • 1. 双链表

    • 1.1 插入操作

    • 1.2 删除操作

  • 2. 循环链表

    • 2.1 循环单链表

    • 2.2 循环双链表

    • 2.3 循环链表判空

      • 2.3.1 循环单链表

      • 2.3.2 循环双链表

  • 3. 静态链表

  • 4. 顺序表与链表比较

    • 4.1 存取方式

    • 4.2 逻辑结构、物理结构

    • 4.3 基本操作

    • 4.4 内存空间

    • 总结

    • 4.5 怎样选择线性表的存储结构

    • 4.6 三个常用操作

      • 4.6.1 最值:

        • 4.6.1.1 顺序表

        • 4.6.1.2 单链表

      • 4.6.2 逆置

        • 4.6.2.1 顺序表:

        • 4.6.2.2 单链表

      • 4.6.3 合并

        • 4.6.3.1 顺序表

        • 4.6.3.2 单链表

1. 双链表

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表

typedef struct DNode {ElemType data;struct DNode *prior, *next;}DNode,*DLinklist;

1.1 插入操作

cf6ef8248d3ea396d93545123e63dd02.png

s->next = p->next;p->next->prior = s;s->prior = p;p->next = s;

1.2 删除操作

准备删除的结点q的后继节点赋给p的后继节点,q结点的下一个结点的前驱结点指向 p83cf2f0a6d3e6c3559dc0f2ad7356f86.png

p->next = q->next;q->next-> prior = p;free(q);

2. 循环链表

循环链表是一种链式存储结构,它的最后一个结点指向头结点,形成一个环。因此,从循环链表中的任何一个结点出发都能找到任何其他结点。循环链表的操作和单链表的操作基本一致,差别仅仅在于算法中的循环条件有所不同。

2.1 循环单链表

43fbc4b0f7779d9ed5cecaf4eff61778.png

2.2 循环双链表

f649c0e532077aac76648ed033ec500e.png

2.3 循环链表判空

2.3.1 循环单链表

L->next == L;

2.3.2 循环双链表

L->next ==L;L->prior == L;

3. 静态链表

静态链表和单链表的区别
静态链表:把地址改成数组下标,下一个结点地址改为下一个结点的下标c334e5a073768301b8a796fb9461c742.pnge3250cf2ceaa2bdcbb8b09c973f80070.png

#define Maxsize 50typedef struct DNode{ElemType data;int next;SLinkList[Maxsize] ;

4. 顺序表与链表比较

4.1 存取方式

单链表只能顺序存取,顺序表可以通过计算得到相应的数据元素地址从而达到随机存取。

4.2 逻辑结构、物理结构

单链表:数据元素存放位置可能相邻可能不相邻
顺序表:一定相邻

4.3 基本操作

插入:
单链表:修改指针即可
顺序表:依次向后移位
删除:
顺序表:依次向前移位
单链表:修改结点的指针
查找:
1.按值查
顺序表:依次遍历,O(n)
单链表:依次遍历,O(n)
2.按序号查:
顺序表:数组下标直接查找
单链表:依次遍历

4.4 内存空间

顺序存储:无论静态分配还是非静态都需要预先分配合适的内存空间
静态分配时预分配空间太大会造成浪费,太小会造成溢出
动态分配时虽不会溢出但是扩充需要大量移动元素,操作效率低
链式存储:在需要时分配结点空间即可,高效方便,但指针要使用额外空间

总结

区别顺序表单链表
存取方式顺序表可以实现顺序存取和随机存取单链表只能实现顺序存取
逻辑、物理存储顺序表逻辑相邻物理上也相邻,通过相邻表示逻辑关系单链表逻辑相邻物理上不一定相邻,通过指针表示逻辑关系
内存空间动态分配时扩充效率低高效、方便
基本操作顺序表单链表
插入&删除O{n)且需要大量移动元素O(1)(节点指针已知);O(n)(节点指针未知),但操作时只需修改指针
查找(按序)O(1)O(n)
查找(按值且无序)O(n)O(n)

4.5 怎样选择线性表的存储结构

4094e4d6302af63bf05b60dc4b2d1caf.png

4.6 三个常用操作

db924e86863b2e58e81eaf30005bd6dc.png

4.6.1 最值:

4.6.1.1 顺序表

顺序表:变量:min、max ,遍历数组分别与最大值最小值比较,如果比最大值大或比最小值小就替换预设变量。时间复杂度:O(n)

int min = L[O];int max = L[O];for(int i = o;i < n;i++){if(min > L[O])		min = L[O];if(max<L[O])		max = L[0];
4.6.1.2 单链表

单链表:设变量,遍历链表,时间复杂度:O(n)

int min = p-> next ->data;int max = p -> next ->data;for( ; p != NULL; p = p ->next){if(min > p ->data)		min = p ->data;if(max< p ->data)		max = p ->data;

4.6.2 逆置

4.6.2.1 顺序表:

设置标志i、j,分别放到数组的最后和最前,ij的元素交换,i向后移,j向前移。一直到j=i;时间复杂度O(n)02524608f76ecb051a43e29eab416e88.png

inti= o;int j = n-1;while(i< j){	temp =L[i];	L[i]= L[j];	L[j]= temp;}
4.6.2.2 单链表

单链表:头结点指针、尾结点指针。头结点插入尾结点,一直到r只向头结点

974053b18cef6107b4dc9bb10a0caca2.pngcb39a131bc0486b79703ed9bee62c32b.png921e4dd8fe1cc72503a74ea231a9d82d.png

while(p ->next != r){temp = p-> next;p -> next = temp -> next;temp -> next = r-> next;r -> next = temp;

4.6.3 合并

4.6.3.1 顺序表

两个数组依次比较,最小的放入新数组,并且依次后移99982890ced679c81d61ead40c3c689f.png

int i= 0,j = O;int k = O;for( ; i<L1_Size &&j <L2_Size; k++){if(L1[i]<L2[j]		L[k]=L1[i++];else		L[k]= L2[j++];}while(i<L1_Size)	L[k++]=L1[i++];while(j<L2_Size)	L[k++]=L1[i++];
4.6.3.2 单链表

单链表:两个链表循环比较,移动指针。30b25f00f18ae07881b687bd5f027b82.png6331e1d05475e9240bb4c0f03c8f55bd.png

while(p->next!=NULL &&q->next!=NULL){if(p->next->data < q->next->data){		r->next = p->next;	p->next= p->next- > next;	r= r- >next;}else{		r- >next = q->next;		q->next= q->next- >next;		r = r- >next;}}if(p->next != NULL) r-> next = p ->next;if(q->next != NULL)r-> next = q ->nefree(p); free(a);

这里与顺序表不同,当一个链表的为空后,只需将下一个链表的指针指向新表,不需要再次循环。

141b8d0da4f4dbcc2d357aebf8b8ee5c.gif 777e2cc9cbd857d531c9ea8a44fa62f5.gif

End

1

发现更多精彩

关注公众号

716ebe88d9740cba0ff817e501e11851.png

d59d654ac3c622f7de77ba74f9becdb0.gif

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/831660
推荐阅读
相关标签
  

闽ICP备14008679号