• 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. }
  • 相关阅读:
    Java实现LeetCode题目
    git(代码冲突解决(客户端操作和命令行操作))
    不用开会员就能在线编辑、管理及分享各类地理空间数据!
    Type android.support.v4.app.INotificationSideChannel is defined multiple times
    dB family cheat sheet: dB, dBW, dBm, dBi, dBc, etc
    Python+requests+pytest+excel+allure 接口自动化测试实战
    阿里云10M公网收费价格表(一年和1个月报价)
    stm32——GPIO学习
    如何破坏开发板iNand中的uboot?
    Java面向对象—继承
  • 原文地址:https://blog.csdn.net/Lao_tan/article/details/125485463