提示信息

双向链表的C语言实现

背道而驰 已关注

双向链表是一种链表数据结构,其中每个节点不仅包含指向下一个节点的指针,还包含指向前一个节点的指针。以下是使用 C 语言实现双向链表的基本结构和操作:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. // 定义节点结构
  4. typedef struct Node {
  5. int data;
  6. struct Node* next;
  7. struct Node* prev;
  8. } Node;
  9. // 创建新节点
  10. Node* createNode(int data) {
  11. Node* newNode = (Node*)malloc(sizeof(Node));
  12. newNode->data = data;
  13. newNode->next = NULL;
  14. newNode->prev = NULL;
  15. return newNode;
  16. }
  17. // 将节点插入到链表的头部
  18. void insertAtHead(Node** head, int data) {
  19. Node* newNode = createNode(data);
  20. if (*head == NULL) {
  21. *head = newNode;
  22. } else {
  23. newNode->next = *head;
  24. (*head)->prev = newNode;
  25. *head = newNode;
  26. }
  27. }
  28. // 将节点插入到链表的尾部
  29. void insertAtTail(Node** head, int data) {
  30. Node* newNode = createNode(data);
  31. if (*head == NULL) {
  32. *head = newNode;
  33. } else {
  34. Node* current = *head;
  35. while (current->next != NULL) {
  36. current = current->next;
  37. }
  38. current->next = newNode;
  39. newNode->prev = current;
  40. }
  41. }
  42. // 从链表中删除节点
  43. void deleteNode(Node** head, int key) {
  44. Node* current = *head;
  45. while (current != NULL && current->data != key) {
  46. current = current->next;
  47. }
  48. if (current == NULL) {
  49. printf("Node with data %d not found.\n", key);
  50. return;
  51. }
  52. if (current->prev != NULL) {
  53. current->prev->next = current->next;
  54. } else { // 如果删除的是头节点
  55. *head = current->next;
  56. }
  57. if (current->next != NULL) {
  58. current->next->prev = current->prev;
  59. }
  60. free(current);
  61. }
  62. // 打印链表
  63. void printList(Node* head) {
  64. Node* current = head;
  65. while (current != NULL) {
  66. printf("%d ", current->data);
  67. current = current->next;
  68. }
  69. printf("\n");
  70. }
  71. // 释放链表
  72. void freeList(Node* head) {
  73. Node* current = head;
  74. while (current != NULL) {
  75. Node* next = current->next;
  76. free(current);
  77. current = next;
  78. }
  79. }
  80. int main() {
  81. Node* head = NULL;
  82. insertAtTail(&head, 10);
  83. insertAtTail(&head, 20);
  84. insertAtTail(&head, 30);
  85. printList(head); // 输出: 10 20 30
  86. insertAtHead(&head, 5);
  87. printList(head); // 输出: 5 10 20 30
  88. deleteNode(&head, 20);
  89. printList(head); // 输出: 5 10 30
  90. freeList(head);
  91. return 0;
  92. }

说明

  1. createNode: 创建一个新节点,并将其nextprev指针初始化为NULL
  2. insertAtHead: 将新节点插入到链表的开头。
  3. insertAtTail: 将新节点插入到链表的末尾。
  4. deleteNode: 从链表中删除包含指定数据的节点(如果存在)。
  5. printList: 打印链表中的所有节点数据。
  6. freeList: 释放链表以避免内存泄漏。

这种基本实现允许你在链表的开头或结尾插入节点,并删除指定节点。

    遇到难题? "AI大模型GPT4.0、GPT" 是你的私人解答专家! 点击按钮去提问......
背道而驰 关注 已关注

最近一次登录:2024-11-20 17:35:36   

暂时还没有签名,请关注我或评论我的文章
×
免费图表工具,画流程图、架构图