当前位置:   article > 正文

C++数据结构补充(双向链表)_c++ 双向链表

c++ 双向链表

双向链表与单向链表的结构类似,但多了一个指向前驱结点的指针。此外空的双向链表的指针域需要特别注意。

双向链表可以有效提高算法的时间性能,说白了就是以空间换取时间。

此外,双向链表也可以有循环链表

1、双向链表初始化

双向链表的初始化如下:

  1. #include"stdio.h"
  2. #include"stdlib.h"
  3. typedef int ElemType;
  4. typedef struct DualNode
  5. {
  6. ElemType data;
  7. struct DualNode* prior; //前驱结点
  8. struct DualNode* next; //后继结点
  9. }DualNode, * DualLinkList;
  10. int InitList(DualLinkList* L, int LinkSize)
  11. {
  12. //生成还有多少个结点的双向链表
  13. DualNode* p, * q;
  14. int i;
  15. *L = (DualLinkList)malloc(sizeof(DualNode));
  16. if (!(*L))
  17. return 0;
  18. (*L)->next = NULL;
  19. (*L)->prior = NULL;
  20. p = (*L);
  21. for (int i = 0; i < LinkSize; i++)
  22. {
  23. q = (DualNode*)malloc(sizeof(DualNode));
  24. if (!(q))
  25. return 0;
  26. q->data = 0; //结点赋值,初值暂定为0
  27. q->prior = p;
  28. q->next = p->next;
  29. p->next = q;
  30. p = q; //更新p的位置
  31. }
  32. //如果想构建循环链表
  33. //p->next = (*L)->next;
  34. //(*L)->next->prior = p;
  35. }

2、循环链表的插入

插入操作需要一个顺序,该顺序不能违反。如果要在第P个位置插入一个新节点,则:

1、首先新建结点s的后继结点应当指向位置P的结点

s->next=p;

2、新建结点s的前驱结点应当指向位置P的上一个结点

s->prior=p->prior;

3、修改P位置上一个结点的指针域,上一个结点的后继结点需要指向s

p->prior->next=s;

4、修改P位置的结点的指针,该节点的前驱结点要修改为s

p->prior=s;

 

  1. int InsetDualLinkList(DualLinkList* L, int posi, ElemType n)
  2. {
  3. //插入在位置posi
  4. DualNode* p, * s;
  5. p = *L;
  6. int i = 1;
  7. //找到第posi个结点
  8. while (p && i < posi)
  9. {
  10. p = p->next;
  11. i++;
  12. }
  13. if (!p || i > posi)
  14. return 0;
  15. //创建待插入结点
  16. s = (DualNode*)malloc(sizeof(DualNode));
  17. s->data = n;
  18. //更新指针域
  19. s->next = p;
  20. s->prior = p->prior;
  21. p->prior->next = s;
  22. p->prior = s;
  23. return 1;
  24. }

3、循环链表的删除

1、首先完成待删除结点P的上下两个结点的指针更新,包括:

p->prior->next=p->next;

p->next->prior=p->prior;

2、更新完成后释放P结点的空间

Free(p);

  1. int DeleteDualLinkList(DualLinkList* L, int posi, ElemType *n)
  2. {
  3. //删除位置posi的结点,其值返回在n里
  4. DualNode* p;
  5. int i = 1;
  6. p = *L;
  7. //找到posi位置
  8. if (!p && i < posi)
  9. {
  10. p = p->next;
  11. i++;
  12. }
  13. if (!p || i > posi)
  14. return 0;
  15. //更新指针域,释放空间
  16. p->prior->next = p->next;
  17. p->next->prior = p->prior;
  18. *n = p->data;
  19. free(p);
  20. return true;
  21. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/746633
推荐阅读
相关标签
  

闽ICP备14008679号