• 关于链表指针的深刻理解


    以下列代码为例

    1. //终于给我搞清楚指针的指向究竟是怎么看的了
    2. // 按编号对职工记录进行递增排序
    3. void sortById(List* list) {
    4. Employee* p, * q, * tail = NULL;
    5. // tail 变量则是一个边界指针,初始值为 NULL。
    6. while (list->head->next != tail) // tail 变量则是一个边界指针,等于tail时,即终止循环
    7. //tail只会不断向前靠,一旦tail为初始数据指针即排序完毕
    8. {
    9. p = list->head;//记录头结点,也就是链表位置的指针
    10. q = p->next;//记录初始起始数据指针,便于后面交换数据
    11. while (q->next != tail) {
    12. if (q->id > q->next->id) {
    13. p->next = q->next;
    14. //意思是p的头结点的下一个位置改为q->next,也就是直接连接了下一个最小的节点
    15. q->next = q->next->next;
    16. //同理,q的下一个节点,即下一个位置的连接为q的下一个的下一个节点的位置
    17. //也就是直接跳过了中间的q->next
    18. // 这里的意思是直接q节点直接跳过q->next,链接q->next->next的意思
    19. //你记住,在左边,最后一个next永远都是指它的下一个位置是什么的意思
    20. // 也就是与哪个节点连接的意思
    21. //而如果前面有多的next,才是看作一个整体,
    22. // 如q->next->next,
    23. //可看成(q->next)->next,即q的下一个节点的下一个位置,即链接的位置是哪?
    24. //而如果在右边,那么next的意思那就全都是看作一起,也就是一个整体
    25. //直接把右边的指针看作成一整块,而不是分开来。
    26. /* 很简单,代码从来都是左边操作,右边赋值的*/
    27. p->next->next = q;
    28. /* 这个就很经典了,意思是
    29. (p->next)->next*/
    30. //即p->next这个整体的下一个位置,链接何处
    31. q = p->next;
    32. /* q重新指向为p->next这个位置*/
    33. //更新p的指针位置,即更新交换后的起始数据指针
    34. }
    35. p = p->next;
    36. q = q->next;
    37. //第一次循环的时候,已经将头指针和最小的节点给确认了
    38. //所以前两个点可以不用管了,直接往下与新的节点比较就好
    39. }
    40. tail = q;
    41. //当内循环退出时,表示当前轮次的排序已完成。将 tail 设为最后一次交换的节点 q,相当于缩小了待排序的范围。
    42. //就是冒泡排序的道理一样的,最后的数据一定是最大的,每一次排序完后,最后的位置是不用动的,
    43. //而前面的数据很可能还要反复地交换,tail就是每一次标记每次循环中最大的数据,一旦遇见直接跳出排序即可
    44. }
    45. printf("按编号排序已完成。\n");
    46. }
    47. //理解误区
    48. //指针的next本质上不是替换,而是位置的确认!
    49. //你记住,next无论如何都是指当前的值的下一个位置指向哪里
    50. //是指向哪里 ,也就是包含了链接的意思,同时又确认了当前指针的下一个位置是什么
    51. //而不是替换值的大小!
    52. //你记住,链表指向的意思是,当前指针的前一个节点,或者下一个节点是什么,是连接也是存储不同的值
    53. //不要把指针和next等同于一个单位看,它还包括了链表之间的连接关系!
    54. //你该关注的是什么,不是next和pre,而是最原始的指针如p,q
    55. //你要关注的是目前p,q这样的指针的具体动向在哪,有没有改变,如果改变了他们的指向也会变得不同
    56. //如果没变,那么p,q永远都是在同一个位置!
    57. //关注原始指针!
    58. //同时还有很重要的一点,就是你一定要考虑清楚,指针究竟有没有改动,以及下一个位置究竟是哪
    59. //都是前后文,自己要注意和看清楚位置究竟是哪,然后,前面自己有改动的地方也要知道
    60. //总的来说就是你一定要清楚自己指针指向的最新位置是哪,前面的可以不考虑
    61. //但当前指向的最新位置一定要清楚!
    62. // 按部门号对职工记录进行递增排序,若部门号相同,则按职工编号递增排序

  • 相关阅读:
    43. 字符串相乘
    CentOS Install Passenger for ROR
    双十一最后一天该怎么入手,几款必备的好物分享
    慢 SQL 优化之索引的作用是什么?
    人机融合态势感知的压缩
    【前端学习记录】neffos插件与控制台交互
    Interceptor的使用场景:拦截请求中的租户信息,注入到租户上下文中
    Elasticsearch:在你的数据上训练大型语言模型 (LLM)
    Tidb简介与应用实践
    BSA/HSA表面修饰二甘醇酐,人血清白蛋白HSA、牛血清白蛋白BSA偶联二甘醇酐
  • 原文地址:https://blog.csdn.net/ASBSIHD/article/details/133775419