单链表(7)

插入函数——插入数据,在链表plist的pos位置插入val数据元素

单链表(7)_第1张图片

由图知,pos==length时,是可以插入的

在大多数情况下,说位置的时候,从0开始计数;说第几个数据的时候,从1开始计数

单链表(7)_第2张图片

单链表(7)_第3张图片

单链表(7)_第4张图片

单链表(7)_第5张图片

现在来测试一下

单链表(7)_第6张图片

这就是链表的插入比顺序表快很多的特点,顺序表中要插入一个数据,就把它后面的所有数据挨个往后移动一个格子,一个插入所有元素就要全移动一遍(特别是如果要头插,插入0号位置),所以说顺序表就是——大量的移动格子,也让速度慢了很多。        而链表只改变相关指针的指向。

所以链表适用于频繁的插入与删除。

这是顺序表的特点

单链表(7)_第7张图片

链表里面头插函数都是单条语句(时间复杂度为O(1)),执行起来就比顺序表中插入函数的for循环要快。

而链表的尾插函数有for循环,单链表(7)_第8张图片时间复杂度为O(n),而顺序表中尾插为O(1)。

例如要插入数据1000,这里进程就一直在循环找尾巴

单链表(7)_第9张图片

然后找到根据条件就退出了

单链表(7)_第10张图片

退出后执行插入操作

单链表(7)_第11张图片

删除函数——删除pos位置的值

单链表(7)_第12张图片

这里有等号是因为5号位置不能执行删除,但5号位置可以插入,所以插入判断中没等号

单链表(7)_第13张图片

错误写法:p->next的值已经发生改变后再来free它

*所以链表中,删除必先保存

单链表(7)_第14张图片

现在来测试一下

单链表(7)_第15张图片

多个测试用例以保证程序的健壮性

链表里面常考3点:头插尾插按(val)值删除

销毁整个内存函数

单链表(7)_第16张图片

这里的头结点head是一个临时变量,除了head头结点之外,剩下所有的结点都是malloc申请来的。所以用完后必须要free,也就是调用销毁函数单链表(7)_第17张图片

之前说过有些没有内存泄漏是因为return 0;了,退出内存会自动归还

但有很多程序永远也执行不到return 0那一句话,在while(1)里面死循环,永远都不退出

清空函数——在链表里面没有必要用

如果结构还要留下继续下一次的使用,那么在下一次往后的每一次的插入删除操作进行之前,还要再多查一次这个结构还剩下几个结点,人也记不住,剩下旧的结点跟新的操作需求的结点一般也对不上,用完后还要再执行申请新的结点,多余些复杂不必要的步骤(每次操作前都要判断),——所以直接连结构一起销毁更好。即——这里的清空直接调用销毁函数,不要结构了

单链表(7)_第18张图片

销毁整个内存函数——把所有的结点都删掉——总是删除第一个数据结点——只要第一个点存在,就把它删掉,直到不存在第一个数据结点为止

单链表(7)_第19张图片

单链表(7)_第20张图片

当删除(free1)第一个结点时,要保证这条链的结构还在(剩下2345),否则就会内存泄漏

所以要一共free5次,就是数据12345,而头结点是不用free的

因为头结点是这里的临时变量,不是malloc来的

也就是一个malloc对应一个free,不能多也不能少

没有malloc,只有free——程序崩溃了

只有malloc,没有free——内存泄漏了

单链表(7)_第21张图片

测试

单链表(7)_第22张图片

单链表(7)_第23张图片

你可能感兴趣的:(数据结构)