单向动态链表

╰半橙微兮° 2022-02-13 09:43 350阅读 0赞

单向动态链表

什么是链表

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)

单向动态链表实现

①头文件代码

  1. #pragma once
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. typedef struct LinkNode {
  6. struct LinkNode* Next;
  7. int Value;
  8. }LinkNode;
  9. typedef struct LinkList {
  10. struct LinkNode* head;
  11. int size;
  12. }LinkList;
  13. //初始化链表
  14. LinkList* Init_LinkList();
  15. //在指定位置插入结点
  16. void Insert_LinkList(LinkList* list, int pos,int Value);
  17. //删除指定位置的结点
  18. void Remove_LinkList(LinkList* list, int pos);
  19. //获得链表的长度
  20. void Size_LinkList(LinkList* list);
  21. //查找链表位置
  22. void Find_LinkList(LinkList* list, int Value);
  23. //打印链表
  24. void Printf_LinkList(LinkList* list);
  25. //返回第一个结点位置
  26. void* Frist_LinkList(LinkList* list);
  27. //释放链表内存
  28. void Free_LinkList(LinkList* list);

②函数文件代码

  1. #include "Linklist.h"
  2. //初始化
  3. LinkList* Init_LinkList() {
  4. LinkList* list = (LinkList*)malloc(sizeof(LinkList));
  5. list->head = (LinkNode*)malloc(sizeof(LinkNode));
  6. list->head->Value =0;
  7. list->head->Next = NULL;
  8. list->size = 0;
  9. return list;
  10. }
  11. //在指定位置插入结点
  12. void Insert_LinkList(LinkList* list, int pos, int Value) {
  13. if (list == NULL) {
  14. return;
  15. }
  16. if (pos<0 || pos>list->size) {
  17. pos = list->size;
  18. }
  19. //创建新结点
  20. LinkNode* NewNode = (LinkNode*)malloc(sizeof(LinkNode));
  21. NewNode->Value = Value;
  22. NewNode->Next = NULL;
  23. //找结点
  24. //辅助指针变量
  25. LinkNode* Pcur = list->head;
  26. for (int i = 0; i < pos; ++i) {
  27. Pcur = Pcur->Next;
  28. }
  29. //插入结点
  30. NewNode->Next = Pcur->Next;
  31. Pcur->Next = NewNode;
  32. ++list->size;
  33. }
  34. //删除指定位置的结点
  35. void Remove_LinkList(LinkList* list, int pos) {
  36. if (list == NULL) {
  37. return;
  38. }
  39. if (pos < 0 || pos >= list->size) {
  40. printf("您输入的位置不合法\n");
  41. }
  42. //创建辅助指针,需要两个辅助指针
  43. LinkNode* Pcur=list->head;
  44. LinkNode* Ppre = Pcur;//用来保存上一个结点的位置
  45. for (int i = 0; i < pos; ++i) {
  46. Ppre = Pcur;
  47. Pcur = Pcur->Next;
  48. }
  49. Ppre->Next = Pcur->Next;
  50. free(Pcur);
  51. --list->size;
  52. }
  53. //获得链表的长度
  54. void Size_LinkList(LinkList* list) {
  55. if (list == NULL) {
  56. return;
  57. }
  58. printf("这个链表现在有%d个结点", list->size - 1);
  59. }
  60. //查找链表位置
  61. void Find_LinkList(LinkList* list, int Value) {
  62. if (list == NULL) {
  63. return;
  64. }
  65. LinkNode* Pcur = list->head;
  66. Pcur = Pcur->Next;
  67. for (int i = 0; i < list->size; ++i) {
  68. if (Pcur->Value == Value) {
  69. printf("这个值在第%d个结点上\n", i);
  70. break;
  71. }
  72. Pcur = Pcur->Next;
  73. }
  74. }
  75. //打印链表
  76. void Printf_LinkList(LinkList* list) {
  77. if (list == NULL) {
  78. return;
  79. }
  80. LinkNode* Pcur = list->head;
  81. for (int i = 0; i < list->size; ++i) {
  82. Pcur = Pcur->Next;
  83. printf("%d--->", Pcur->Value);
  84. }
  85. printf("NULL\n");
  86. }
  87. //返回第一个结点位置
  88. void* Frist_LinkList(LinkList* list) {
  89. return list->head->Next;
  90. }
  91. //释放链表内存
  92. void Free_LinkList(LinkList* list) {
  93. if (list == NULL) {
  94. return;
  95. }
  96. //辅助指针
  97. LinkNode* Pcur = list->head;
  98. while (Pcur != NULL) {
  99. LinkNode* Ppre = Pcur->Next;
  100. free(Pcur);
  101. Pcur = Ppre;
  102. }
  103. free(list);
  104. }

③测试文件代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "Linklist.h"
  4. void test01() {
  5. //初始化
  6. LinkList* list = Init_LinkList();
  7. //插入新结点
  8. for (int i = 0; i < 15; ++i) {
  9. Insert_LinkList(list, i, 2 * i);
  10. }
  11. //打印结点
  12. Printf_LinkList(list);
  13. //删除结点
  14. Remove_LinkList(list, 5);
  15. Printf_LinkList(list);
  16. //查找
  17. Find_LinkList(list, 10);
  18. //释放内存
  19. Free_LinkList(list);
  20. }
  21. int main() {
  22. test01();
  23. system("pause");
  24. return 0;
  25. }

发表评论

表情:
评论列表 (有 0 条评论,350人围观)

还没有评论,来说两句吧...

相关阅读

    相关 单向

    单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。

    相关 单向

    一:单向链表 单向链表中的节点包含数据域和next指针域。 ![20210306162342140.png][] 单向链表的增删查改代码实现 Hero

    相关 单向动态

    单向动态链表 什么是链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结