插入函数——插入数据,在链表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——内存泄漏了
测试