当前位置:   article > 正文

详细解析单链表带头节点的结构体定义,普通单链表与有序单链表的创建等操作(含创建步骤与码源)_带头结点的链表定义

带头结点的链表定义

14天阅读挑战赛
努力是为了不平庸~
算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!欢迎记录下你的那些努力时刻(算法学习知识点/算法题解/遇到的算法bug/等等),在分享的同时加深对于算法的理解,同时吸收他人的奇思妙想,一起见证技术er的成长~

目录

单链表回顾

带头结点的单链表

带头节点的意义

什么是头节点

头节点与数据节点定义

创建带头节点的单链表的步骤与详细代码

创建有序带头节点单链表的步骤与码源


单链表回顾

如果对普通单链表又需求,可到博主主页搜索“大厂面试经典单链表例题”即可。

带头结点的单链表

带头节点的意义

很多时候我们可能经常需要知道一个链表有多少个结点,或者求一个链表的最后一个结点...
        => 我们都要通过第一个结点的指针,遍历整个链表。

而一个头节点就能很好的帮我们解决这个问题,而且只需要知道单链表的第一个结点的指针,first  对单链表的基本操作 “增删改查”就可以完成了

例如:

  1. find_x
  2. p = h;
  3. while(p)
  4. {
  5. if(p->data == x)
  6. {
  7. break;
  8. }
  9. p = p->next;
  10. }
  11. find_last
  12. p = h;
  13. while(p)
  14. {
  15. if(p->next == NULL)
  16. {
  17. reak;
  18. }
  19. p = p->next;
  20. }

什么是头节点

    头结点是用来管理链表的结点,这个结点一般包括常用的管理链表的数据对象:
    eq: 指向链表的第一个结点指针 ,指向链表最后一个结点的指针...
    
    什么是数据结点?
        原来用来保存数据的结点 就称为数据结点
        
    头结点是唯一一个标识一个链表存在与否的标志。
    
    带头结点的单链表:
        一个链表可以没有数据结点,但是必须要有头结点。
        
        没有数据结点,表示“空链表”
        没有头结点,表明这个链表不存在

头节点与数据节点定义

提示:简单描述算法知识点相关题目题意

  1. //数据结点:
  2. typedef int ElemType;
  3. typedef struct node
  4. {
  5. ElemType data;//数据域
  6. struct node *next;//指针域
  7. }Node;
  8. //头结点:不保存数据 只有两个指针 加一个结点数目
  9. typedef struct linkedlist
  10. {
  11. Node *first;//指向链表中的第一个数据结点
  12. Node *last;//指向链表中的最后一个数据结点
  13. ElemType NodeNum;//结点的数目
  14. //...//根据具体需求 增加其它的成员变量
  15. }List;

创建带头节点的单链表的步骤与详细代码

根据用户的输入数据 创建一个单链表
    step1:创建一个头结点
    step2:每获得一个数据就创建一个数据结点
    step3:把获得的数据 写入到数据结点中
    step4:把数据结点加入到链表中去。

  1. List *create_list()
  2. {
  3. ElemType d;//用来保存获取的数据
  4. Node *pnew = NULL;//指向新创建的数据结点
  5. //step1:创建一个头结点
  6. List *list = malloc(sizeof(*list));
  7. list->first = NULL;
  8. list->last = NULL;
  9. list->NodeNum = 0;
  10. //step2 :每获得一个数据就创建一个数据结点
  11. while(1)
  12. {
  13. scanf("%d",&d);
  14. if(d == 0)
  15. {
  16. break;
  17. }
  18. pnew = malloc(sizeof(*pnew));
  19. //step3:把获得的数据 写入到数据结点中
  20. pnew->data = d;
  21. pnew->next = NULL;
  22. //step4:把数据结点加入到链表中去。
  23. if(list->first == NULL)//从无都有
  24. {
  25. list->first = pnew;
  26. list->last = pnew;
  27. }
  28. else//从少到多
  29. {
  30. //尾插
  31. #if 1
  32. list->last->next = pnew;
  33. list->last = pnew;
  34. #endif
  35. //头插
  36. #if 0
  37. pnew->next = list->first;
  38. list->first = pnew;
  39. #endif
  40. }
  41. list->NodeNum++;
  42. }
  43. return list;
  44. }

创建有序带头节点单链表的步骤与码源

    创建一条带头结点的有序列表  升序
        step1:创建一个头结点
        step2:每获得一个数据就创建一个数据结点
        step3:把获得的数据 写入到数据结点中
        step4:把数据结点加入到链表中去。
                从无到有
                从少到多 --》找到第一个比pnew大的数据
                    1.第一个就比pnew大 pnew头插
                    2.找一了遍 没有找

  1. /*
  2. create_sort_list:创建一条带头结点的有序单链表
  3. 返回值:
  4. 创建好的单链表的头结点
  5. */
  6. List *create_sort_list()
  7. {
  8. ElemType d;//用来保存获取的数据
  9. Node *pnew= NULL;//指向新创建的数据结点
  10. //step1:创建一个头结点
  11. List *list = malloc(sizeof(*list));
  12. list->first = NULL;
  13. list->last = NULL;
  14. list->NodeNum = 0;
  15. while(1)
  16. {
  17. //step2:每获得一个数据就创建一个数据结点
  18. scanf("%d",&d);
  19. if(d == 0)
  20. {
  21. break;
  22. }
  23. pnew = malloc(sizeof(*pnew));
  24. //step3:把获得的数据 写入到数据结点中
  25. pnew->data = d;
  26. pnew->next = NULL;
  27. //step4:把数据结点加入到链表中去。
  28. if(list->first == NULL)//从无到有
  29. {
  30. list->first = pnew;
  31. list->last = pnew;
  32. }
  33. else//从少到多
  34. {
  35. Node *p = list->first;//遍历指针 要找到第一个比pnew大的值
  36. Node *pre = NULL;//指向p前面的那个结点
  37. while(p)
  38. {
  39. if(p->data > pnew->data)//找到了
  40. {
  41. break;
  42. }
  43. pre = p;
  44. p = p->next;
  45. }
  46. if(p != NULL)
  47. {
  48. if(p == list->first)//头插 第一个数就比我的Pnew大
  49. {
  50. pnew->next = list->first;
  51. list->first = pnew;
  52. }
  53. else
  54. {
  55. pre->next = pnew;
  56. pnew->next = p;
  57. }
  58. }
  59. else//p为null pnew最大
  60. {
  61. //pre->next = pnew;
  62. list->last->next = pnew;
  63. list->last = pnew;
  64. }
  65. }
  66. list->NodeNum++;
  67. }
  68. return list;//返回头结点 代表整个链表
  69. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/429782
推荐阅读
相关标签
  

闽ICP备14008679号