0


【数据结构与算法】—— * 双向链表 *


双向链表的储存结构示意图


双向链表的初始化结构

1.双向链表的结点

代码实现

  1. //双向链表的结点,包含一个数据域,两个指针域
  2. typedef struct DoublyNode {
  3. ElementType date; //数据域
  4. struct DoublyNode* prev; //指向前缀结点
  5. struct DoublyNode* next; //指向后缀结点
  6. }DoublyNode;

2.双向链表的头结点

  1. //双向链表
  2. typedef struct DoublyLinkList {
  3. int length;
  4. DoublyNode* next;
  5. };

3.总代码

  1. //双向链表的结点,包含一个数据域,两个指针域
  2. typedef struct DoublyNode {
  3. ElementType date; //数据域
  4. struct DoublyNode* prev; //指向前缀结点
  5. struct DoublyNode* next; //指向后缀结点
  6. }DoublyNode;
  7. //双向链表
  8. typedef struct DoublyLinkList {
  9. int length;
  10. DoublyNode* next;
  11. };

双向链表中的指定文件插入元素

1,插入的为第一个位置

代码实现

2.其他位置插入

代码实现

总代码

  1. void InsertDoublyLinkList(DoublyLinkList* dlist, int pos, ElementType element) {
  2. //创建空节点
  3. DoublyNode* node = (DoublyLinkList*)malloc(sizeof(DoublyLinkList));
  4. node->date = element;
  5. node->prev = NULL;
  6. node->next = NULL;
  7. //在第一个位置插入结点
  8. if (pos == 1) {
  9. node->next = dlist->next;
  10. dlist->next = node;
  11. node->next->prev = node;
  12. dlist->length++;
  13. return;
  14. }
  15. DoublyLinkList* currNode = dlist->next;
  16. for (int i = 1; currNode && i < pos - 1; i++) {
  17. currNode = currNode->next;
  18. }
  19. if (currNode) {
  20. node->prev = currNode;
  21. if (currNode->next) {
  22. //如果前置结点非空->因为空就表示没有后继结点了
  23. //将插入位置的前置结点改为指向新结点
  24. currNode->next->prev = node;
  25. }
  26. node->next = currNode->next;
  27. currNode->next = node;
  28. dlist->length++;
  29. }
  30. }


双向链表的删除

1.删除第一个元素

代码实现

2.删除其他位置元素

代码实现

总代码

  1. void DeleteDoublyLinkList(DoublyLinkList* dlist, int pos) {
  2. if (pos == 1) {
  3. DoublyLinkList* node = dlist->next;
  4. if (node) {
  5. dlist->next;
  6. if (node->next) {
  7. //如果哟有第二个结点,那么设置第二个结点的前置结点为NULL
  8. node->next->prev = NULL;
  9. }
  10. free(node);
  11. dlist->length--;
  12. }
  13. return;
  14. }
  15. DoublyLinkList* node = dlist->next;
  16. for (int i = 1; i < pos; i++) {
  17. node = node->next;
  18. }
  19. if (node) {
  20. if (node->next) {
  21. node->next->prev = node->prve;
  22. }
  23. node->prev->next = node->next;
  24. free(node);
  25. dlist->length--;
  26. }
  27. return;
  28. }


本文转载自: https://blog.csdn.net/forever_bryant/article/details/122161335
版权归原作者 玄澈_ 所有, 如有侵权,请联系我们删除。

“【数据结构与算法】&mdash;&mdash; * 双向链表 *”的评论:

还没有评论