单链表(7)

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

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

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

现在来测试一下

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

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

这是顺序表的特点

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

而链表的尾插函数有for循环,时间复杂度为O(n),而顺序表中尾插为O(1)。

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

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

退出后执行插入操作

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

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

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

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

现在来测试一下

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

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

销毁整个内存函数

这里的头结点head是一个临时变量,除了head头结点之外,剩下所有的结点都是malloc申请来的。所以用完后必须要free,也就是调用销毁函数

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

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

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

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

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

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

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

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

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

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

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

测试

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值