当前位置:   article > 正文

C语言:数据结构链表基本操作(增、删、改、查、遍历)_c语言 链表的增删改查

c语言 链表的增删改查

一、数据结构-链表介绍

链表:在物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。由一系列节点(链表中每一个元素称为节点/结点)组成,节点可以在运行时动态生成。每个节点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个节点地址的指针域。

链表可以分为单向链表和双向链表两种形式。在单向链表中,每个节点只保存指向下一个节点的指针,而在双向链表中,每个节点同时保存指向上一个节点和下一个节点的指针。

二、链表操作

  • 插入:在链表的任意位置插入一个节点;
  • 删除:从链表中删除一个节点;
  • 查找:在链表中查找指定的数据;
  • 修改:修改链表中节点的数据;
  • 遍历:按照顺序依次访问链表中的每个节点。

三、创建和释放

1. 创建节点

  1. // 创建一个新节点
  2. Node* createNode(ElemType data)
  3. {
  4. Node* newNode = (Node*)malloc(sizeof(Node));
  5. if(newNode != NULL)
  6. {
  7. newNode -> data = data; // 设置数据
  8. newNode -> next = NULL; // 新节点的下一个节点为空
  9. }
  10. return newNode;
  11. }

2. 创建空链表

  1. // 创建一个空链表
  2. linkedList* createLinkedList()
  3. {
  4. linkedList* list = (linkedList*)malloc(sizeof(linkedList));
  5. if(list != NULL)
  6. {
  7. list -> head = NULL; // 头指针为空
  8. list -> length = 0; // 链表长度为0
  9. }
  10. return list;
  11. }

3. 释放空间

  1. // 释放链表的内存
  2. void freeLinkedList(linkedList* list)
  3. {
  4. if(list == NULL)
  5. return;
  6. Node* current = list -> head;
  7. while(current != NULL)
  8. {
  9. Node* temp = current;
  10. current = current -> next;
  11. free(temp); // 释放节点内存
  12. }
  13. free(list); // 释放链表内存
  14. }

四、链表操作各部分代码实现

1. 插入

  1. // 在链表的指定位置插入节点
  2. void insertNode(linkedList* list, int pos, ElemType data)
  3. {
  4. if(list == NULL || pos < 0 || pos > list -> length)
  5. return;
  6. Node* newNode = createNode(data); // 创建新节点
  7. if(newNode == NULL)
  8. return;
  9. if(pos == 0)
  10. {
  11. newNode -> next = list -> head; // 将新节点插入到链表头部
  12. list -> head = newNode; // 更新头指针
  13. }
  14. else
  15. {
  16. Node* current = list -> head;
  17. for(int i =0; i < pos - 1; i++) // 找到插入位置的前一个节点
  18. {
  19. current = current -> next;
  20. }
  21. newNode -> next = current -> next; // 新节点指向原来位置的节点
  22. current -> next = newNode; // 前一个节点指向新节点
  23. }
  24. list -> length ++; // 链表长度加 1
  25. }

2. 删除

  1. // 删除链表的指定位置的节点
  2. void deleteNode(linkedList* list, int pos)
  3. {
  4. if(list == NULL || pos < 0 || pos >= list -> length)
  5. return;
  6. Node* temp;
  7. if(pos == 0)
  8. {
  9. temp = list -> head; // 保存头节点
  10. list -> head = list -> head -> next; // 更新头指针
  11. }
  12. else
  13. {
  14. Node* current = list -> head;
  15. for(int i = 0; i < pos - 1; i++) // 找到要删除节点的前一个节点
  16. {
  17. current = current -> next;
  18. }
  19. temp = current -> next; // 保存要删除的节点
  20. current -> next = temp -> next; // 前一个节点指向要删除节点的下一个节点
  21. }
  22. free(temp); // 释放节点内存
  23. list -> length--; // 链表长度减1
  24. }

3. 修改

  1. // 查找链表中指定数据的位置
  2. int findNode(linkedList* list, ElemType data)
  3. {
  4. if(list == NULL)
  5. return -1;
  6. Node* current = list -> head;
  7. int pos = 0;
  8. while(current != NULL) // 遍历链表
  9. {
  10. if(current -> data == data) // 找到数据相同的节点
  11. return pos;
  12. current = current -> next;
  13. pos++;
  14. }
  15. return -1; // 数据不存在
  16. }

4. 查找

  1. // 查找链表中指定数据的位置
  2. int findNode(linkedList* list, ElemType data)
  3. {
  4. if(list == NULL)
  5. return -1;
  6. Node* current = list -> head;
  7. int pos = 0;
  8. while(current != NULL) // 遍历链表
  9. {
  10. if(current -> data == data) // 找到数据相同的节点
  11. return pos;
  12. current = current -> next;
  13. pos++;
  14. }
  15. return -1; // 数据不存在
  16. }

5. 遍历

  1. // 遍历,打印链表的所有节点数据
  2. void printLinkedList(linkedList* list)
  3. {
  4. if(list == NULL)
  5. return;
  6. Node* current = list -> head;
  7. while(current != NULL)
  8. {
  9. printf("%d ",current -> data);
  10. current = current -> next;
  11. }
  12. printf("\n");
  13. }

五、完整代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef int ElemType;
  4. // 定义链表节点
  5. typedef struct Node{
  6. ElemType data;
  7. struct Node* next;
  8. }Node;
  9. // 定义链表结构
  10. typedef struct{
  11. Node* head; // 头指针
  12. int length; // 链表长度
  13. }linkedList;
  14. // 创建一个新节点
  15. Node* createNode(ElemType data)
  16. {
  17. Node* newNode = (Node*)malloc(sizeof(Node));
  18. if(newNode != NULL)
  19. {
  20. newNode -> data = data; // 设置数据
  21. newNode -> next = NULL; // 新节点的下一个节点为空
  22. }
  23. return newNode;
  24. }
  25. // 创建一个空链表
  26. linkedList* createLinkedList()
  27. {
  28. linkedList* list = (linkedList*)malloc(sizeof(linkedList));
  29. if(list != NULL)
  30. {
  31. list -> head = NULL; // 头指针为空
  32. list -> length = 0; // 链表长度为0
  33. }
  34. return list;
  35. }
  36. // 在链表的指定位置插入节点
  37. void insertNode(linkedList* list, int pos, ElemType data)
  38. {
  39. if(list == NULL || pos < 0 || pos > list -> length)
  40. return;
  41. Node* newNode = createNode(data); // 创建新节点
  42. if(newNode == NULL)
  43. return;
  44. if(pos == 0)
  45. {
  46. newNode -> next = list -> head; // 将新节点插入到链表头部
  47. list -> head = newNode; // 更新头指针
  48. }
  49. else
  50. {
  51. Node* current = list -> head;
  52. for(int i =0; i < pos - 1; i++) // 找到插入位置的前一个节点
  53. {
  54. current = current -> next;
  55. }
  56. newNode -> next = current -> next; // 新节点指向原来位置的节点
  57. current -> next = newNode; // 前一个节点指向新节点
  58. }
  59. list -> length ++; // 链表长度加 1
  60. }
  61. // 删除链表的指定位置的节点
  62. void deleteNode(linkedList* list, int pos)
  63. {
  64. if(list == NULL || pos < 0 || pos >= list -> length)
  65. return;
  66. Node* temp;
  67. if(pos == 0)
  68. {
  69. temp = list -> head; // 保存头节点
  70. list -> head = list -> head -> next; // 更新头指针
  71. }
  72. else
  73. {
  74. Node* current = list -> head;
  75. for(int i = 0; i < pos - 1; i++) // 找到要删除节点的前一个节点
  76. {
  77. current = current -> next;
  78. }
  79. temp = current -> next; // 保存要删除的节点
  80. current -> next = temp -> next; // 前一个节点指向要删除节点的下一个节点
  81. }
  82. free(temp); // 释放节点内存
  83. list -> length--; // 链表长度减1
  84. }
  85. // 更新链表的指定位置的节点数据
  86. void updateNode(linkedList* list, int pos, ElemType data)
  87. {
  88. if(list == NULL || pos < 0 || pos >= list -> length)
  89. return;
  90. Node* current = list -> head;
  91. for(int i = 0; i < pos; i++) // 找到要更新的节点
  92. {
  93. current = current -> next;
  94. }
  95. current -> data = data; // 更新节点数据
  96. }
  97. // 查找链表中指定数据的位置
  98. int findNode(linkedList* list, ElemType data)
  99. {
  100. if(list == NULL)
  101. return -1;
  102. Node* current = list -> head;
  103. int pos = 0;
  104. while(current != NULL) // 遍历链表
  105. {
  106. if(current -> data == data) // 找到数据相同的节点
  107. return pos;
  108. current = current -> next;
  109. pos++;
  110. }
  111. return -1; // 数据不存在
  112. }
  113. // 遍历,打印链表的所有节点数据
  114. void printLinkedList(linkedList* list)
  115. {
  116. if(list == NULL)
  117. return;
  118. Node* current = list -> head;
  119. while(current != NULL)
  120. {
  121. printf("%d ",current -> data);
  122. current = current -> next;
  123. }
  124. printf("\n");
  125. }
  126. // 释放链表的内存
  127. void freeLinkedList(linkedList* list)
  128. {
  129. if(list == NULL)
  130. return;
  131. Node* current = list -> head;
  132. while(current != NULL)
  133. {
  134. Node* temp = current;
  135. current = current -> next;
  136. free(temp); // 释放节点内存
  137. }
  138. free(list); // 释放链表内存
  139. }
  140. int main()
  141. {
  142. linkedList* list = createLinkedList(); // 创建一个链表
  143. insertNode(list, 0, 10);
  144. insertNode(list, 1, 20);
  145. insertNode(list, 2, 30);
  146. printLinkedList(list);
  147. updateNode(list, 1, 25);
  148. printLinkedList(list);
  149. deleteNode(list, 2);
  150. printLinkedList(list);
  151. int pos = findNode(list, 30);
  152. printf("pos = %d\n", pos);
  153. freeLinkedList(list);
  154. return 0;
  155. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号