当前位置:   article > 正文

数据结构——双向链表(C语言版)

数据结构——双向链表(C语言版)

上一章:数据结构——单向链表(C语言版)-CSDN博客

目录

什么是双向链表?

双向链表的节点结构

双向链表的基本操作

完整的双向链表示例

总结


什么是双向链表

双向链表是一种常见的数据结构,它由一系列节点组成,每个节点包含两个指针:一个指向前一个节点,一个指向后一个节点。双向链表可以在任意位置高效地插入和删除节点,相比单向链表,双向链表可以双向遍历,但相应地需要更多的内存空间存储额外的指针。

双向链表的节点结构
  1. typedef struct Node {
  2. int data;
  3. struct Node* prev;
  4. struct Node* next;
  5. } Node;
双向链表的基本操作
  1. 初始化双向链表

    1. Node* initLinkedList() {
    2. Node* head = (Node*)malloc(sizeof(Node));
    3. head->prev = NULL;
    4. head->next = NULL;
    5. return head;
    6. }
  2. 插入节点 

    1. void insertNode(Node* prevNode, int data)
    2. { Node* newNode = (Node*)malloc(sizeof(Node));
    3. newNode->data = data;
    4. newNode->prev = prevNode;
    5. newNode->next = prevNode->next;
    6. prevNode->next->prev = newNode;
    7. prevNode->next = newNode;}

    3.删除节点

  1. void deleteNode(Node* delNode) {
  2. delNode->prev->next = delNode->next;
  3. delNode->next->prev = delNode->prev;
  4. free(delNode);
  5. }
  1. 遍历双向链表
    1. void printLinkedList(Node* head) {
    2. Node* current = head->next;
    3. while (current != NULL) {
    4. printf("%d ", current->data);
    5. current = current->next;
    6. }
    7. printf("\\n");
    8. }
完整的双向链表示例
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct Node {
  4. int data;
  5. struct Node* prev;
  6. struct Node* next;
  7. } Node;
  8. Node* initLinkedList() {
  9. Node* head = (Node*)malloc(sizeof(Node));
  10. head->prev = NULL;
  11. head->next = NULL;
  12. return head;
  13. }
  14. void insertNode(Node* prevNode, int data) {
  15. Node* newNode = (Node*)malloc(sizeof(Node));
  16. newNode->data = data;
  17. newNode->prev = prevNode;
  18. newNode->next = prevNode->next;
  19. prevNode->next->prev = newNode;
  20. prevNode->next = newNode;
  21. }
  22. void deleteNode(Node* delNode) {
  23. delNode->prev->next = delNode->next;
  24. delNode->next->prev = delNode->prev;
  25. free(delNode);
  26. }
  27. void printLinkedList(Node* head) {
  28. Node* current = head->next;
  29. while (current != NULL) {
  30. printf("%d ", current->data);
  31. current = current->next;
  32. }
  33. printf("\\n");
  34. }
  35. int main() {
  36. Node* head = initLinkedList();
  37. insertNode(head, 1);
  38. insertNode(head->next, 2);
  39. insertNode(head->next->next, 3);
  40. printLinkedList(head);
  41. deleteNode(head->next);
  42. printLinkedList(head);
  43. return 0;
  44. }
总结

通过上述代码示例,我们实现了双向链表的基本操作,包括初始化、插入和删除节点,以及遍历链表。双向链表是一种灵活且高效的数据结构,适用于需要频繁插入和删除操作的场景。通过深入理解双向链表的实现原理,我们可以更好地应用它解决实际问题。

由以上内容我们其实就可以看到在应用与理解层面,双向链表相较于单向链表有很大的优势,但在具体应用中还需要我们实际情况实际判断。

感谢观看,还请各位大佬点赞支持以下!!!

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

闽ICP备14008679号