链表与数组的区别
链表和数组都可以用于存放数据,区别在于数组存放的数据地址是连续的,你能在下一个数据类型长度的地址找到下个数据,而链表存放数据的地址不是连续的,是利用指针存放地址的方法指向一个空间将数据链在一起。
初始化方式:数组://数据类型 数组名[ ] ={初始化};
链表://结构体中再定义一个相同类型的结构体指针
静态创建和链表遍历
静态创建:这个指的是程序员自己手动创建节点
可以看到头节点的下一个指向了mid这个新节点,而mid节点也指向了下一个尾节点从而形成了一个链表。每当你想再加一个节点时,可以重复以上的操作,这就是静态创建。
链表遍历:因为初始化好节点,如果没有指向另一个节点则为NULL,因此可以利用这个来遍历链表。
因为最后一项的next指向NULL,所以可以检测每次的每次存放的地址是否为NULL,如果不是NULL就进行操作,否则就结束。这就完成了链表的遍历。
链表的基础操作
增加节点
链表节点的增加分为两种基础方式,一个是在节点后插入,另一个是在节点前插入
节点后插入:原理为将两个原有节点的链接修改,通过遍历的方法找到想要插入的节点,此时是对该节点上进行操作。先将新节点指向当下节点的下一个节点,此时的情况是当下节点指向了下个节点,新的节点也指向了同一个节点,因此最后要将当下节点修改成指向新节点,从而形成新的链表。
节点前插入:此时分为了两种情况,一种是在头节点前插入,即更改头节点,这个需要返回地址值给主函数,因为修改头节点的地址;第二种是在中间节点插入。第一种情况只需要在遍历前先对头节点判断一下,若要在头节点前插入就将新节点指向原来的头节点,再将新节点的地址值返回。第二种情况,因为在链表中对后方节点控制较为简单因此可以采用找到当下节点指向的下个节点判断是否为我们想要插入的节点然后对当下节点进行后插法,即上面讲的方法,返回头节点的地址就可以完成对节点的前插。
删除节点
删除节点分为两种情况,一是删除头节点,二是删除中间节点。
第一种情况:可以将头节点的下一个节点直接变成头节点。(此时可能要面临内存释放的问题,如果链表是动态创建的话,即malloc创建的节点)
第二种情况:可以将当下节点修改成指向下下节点,直接越过下个节点。(这种情况在动态创建时也要考虑释放的问题)
同时也要返回地址值,因为要涉及到修改头节点。
结果演示
链表的动态创建
头插法
原理:类似于节点前插入的方法,每个新节点前插在原来的头节点作为新的头节点。
做法:利用malloc申请空间,创建新节点,将新节点指向原来头节点,再将新节点定义为新的头节点。
尾插法
原理:利用节点后插入的方式来创建新的链表,通过遍历找到尾部,再将尾节点指向新节点完成从尾部动态创建链表
个人学习笔记,有错误有望指正