链表学习之增删查改
链表是一种高效的数据结构,能够实现对线性数据的快速处理,生活中的应用非常广泛,例如点歌时候对歌曲的处理。(可以理解为将数据和指针用结构体打包,用指针的特点在逻辑上串联数据)
分类与区别(补图):
①单链表:最后一位指向空
②单向循环链表:比单链表多了:尾节点->头节点
③双向链表:比单链表多了返回方向
④双向循环链表(内核链表):比单向循环链表多了返回方向
实现一个链表的公共步骤:
1.链表初始化(申请头节点内存空间;) 2.创建新节点(需要指向NULL)
3.各位置插入操作:头 中 尾(包括最后一个有效的前一位:判断不全引起的)
4.删除链表节点的元素 5.修改元素 打印
特殊链表的区别步骤:
总结:
1.使用的关键在于确定好要查找的位置,通过指针P的关系来进行修改等操作,注意逻辑关系,断开前考虑是否还要再引用,断开了就不能再引用,写代码时专注某模块;
2.常用位置表示:p>next=NULL;//p为辅助指针,遍历链表用;
3.敲码思路:画步骤图(画上head,断开关系画×)加叫法;
4.p->next->next=NULL;//叫法:p的next的next指向空)
5.初始化时(或者新增节点时最好赋值NULL,防止野指针),pHead->pNext = NULL;//防止乱指向
使用注意:
1.【判断申请内存空间是否成功的位置】初始化头节点(创建新节点);
2.判断用户输入比对值是否存在;
3.判断最后一位有效数据的条件(往往需要考虑在最后前一位进行插入操作)
4.新增或删除节点等操作要实时更新下标
问题探讨
①顺序表插入问题:p->next->stu.name是否还要判断最后一位?
②健壮性:;1.判断malloc分配的head是否为空(严谨);2.控制输入字节长度,buf判断提醒长度; 3.删除操作时要将20的值赋值给19的时候检测,不能给其他引用;char *p=&a;//a为int,可以通过编译原因:
③函数执行结果返回小技巧:设置ret值让函数返回;
④带参数的宏-续行符:\ ,宏直接替换,定义为结构体指针时需要加()->安全,防止替换出错
⑤节点处理完成后要进行位置更新操作