• c语言练习95:练习使用双向链表(实现增删改查)


    练习使用双向链表(实现增删改查)

     

    是指针指向了一块被释放的空间 

    解决方案:

    plist=NULL

     

    List.h

    1. #pragma once
    2. #define _CRT_SECURE_NO_WARNINGS
    3. #include
    4. #include
    5. #include
    6. #include
    7. //定义双向链表结点的结构
    8. typedef int LTDataType;
    9. typedef struct ListNode {
    10. LTDataType data;
    11. struct ListNode* next;
    12. struct ListNode* prev;
    13. }LTNode;
    14. //传入一个头结点
    15. //void LTInit(LTNode** pphead);//pphead保存plist的地址
    16. LTNode* LTInit();//不需要传入参数,调用该方法后返回一个头结点
    17. //双向链表中不会改变哨兵卫,所以这里都可以传一级指针
    18. //插入删除操作
    19. //尾插
    20. void LTPushBack(LTNode* phead, LTDataType x);
    21. //头插
    22. void LTPushFront(LTNode* phead, LTDataType x);
    23. //尾删
    24. void LTPopBack(LTNode* phead);
    25. //头删
    26. void LTPopFront(LTNode* phead);
    27. //在pos位置之后插入数据
    28. void LTInsert(LTNode* pos, LTDataType x);
    29. void LTErase(LTNode* pos);
    30. LTNode* LTFind(LTNode* phead, LTDataType x);
    31. //销毁
    32. void LTDistory(LTNode* phead);
    33. //void Distory(LTNode** phead);
    34. //
    35. //打印
    36. void LTPrint(LTNode* phead);

     List.c

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include"List.h"
    3. //传入一个头结点
    4. //void LTInit(LTNode** pphead) {//头结点指针的地址
    5. // //申请结点
    6. // *pphead = (LTNode*)malloc(sizeof(LTNode));
    7. // if (*pphead == NULL) {
    8. // perror("malloc fail!\n");
    9. // return;
    10. // }
    11. // //结点包括三部分:数据,(前驱,后记)指针
    12. // (*pphead)->data = -1;//哨兵卫
    13. // (*pphead)->next = (*pphead)->prev = *pphead;
    14. //
    15. //}
    16. //不需要传入参数,调用该方法后返回一个头结点
    17. LTNode* LTInit() {
    18. LTNode* phead = (LTNode*)malloc(sizeof(LTNode));
    19. if (phead == NULL) {
    20. perror("malloc fail\n");
    21. return;
    22. }
    23. phead->data = -1;
    24. phead->next = phead->prev = phead;
    25. return phead;
    26. }
    27. LTNode*ListBuyNode(LTDataType x) {
    28. LTNode* node = (LTNode*)malloc(sizeof(LTNode));
    29. node->data = x;
    30. node->next = node->prev = NULL;
    31. return node;
    32. }
    33. //插入删除操作
    34. void LTPushBack(LTNode* phead, LTDataType x) {
    35. assert(phead);
    36. LTNode* node = ListBuyNode(x);
    37. //处理node的前驱和后继指针
    38. node->prev = phead->prev;
    39. node->next = phead;
    40. //处理phead和之前的尾结点phead->prev
    41. phead->prev->next = node;
    42. phead->prev = node;
    43. }
    44. //头插
    45. void LTPushFront(LTNode* phead, LTDataType x) {
    46. assert(phead);
    47. LTNode*node= ListBuyNode(x);
    48. //处理node的前驱和后继指针
    49. node->prev = phead;
    50. node->next = phead->next;
    51. //处理phead和之前的尾结点phead->next
    52. phead->next->prev = node;
    53. phead->next = node;
    54. }
    55. //尾删
    56. void LTPopBack(LTNode* phead) {
    57. assert(phead);
    58. assert(phead->next != phead);
    59. LTNode* del = phead->prev;
    60. //处理del的prev结点
    61. del->prev->next = phead;
    62. //处理phead
    63. phead->prev = del->prev;
    64. free(del);
    65. del = NULL;
    66. }
    67. //头删
    68. void LTPopFront(LTNode* phead) {
    69. LTNode* del = phead->next;
    70. assert(phead);
    71. assert(phead->next != phead);
    72. del->next->prev = phead;
    73. phead->next = del->next;
    74. free(del);
    75. del = NULL;
    76. }
    77. //在pos位置之后插入数据
    78. void LTInsert(LTNode* pos, LTDataType x) {
    79. assert(pos);
    80. LTNode* node = ListBuyNode(x);
    81. node->next = pos->next;
    82. node->prev = pos;
    83. pos->next = node;
    84. node->next->prev = node;
    85. }
    86. void LTErase(LTNode* pos) {
    87. assert(pos);
    88. pos->next->prev = pos->prev;
    89. pos->prev->next = pos->next;
    90. free(pos);
    91. pos = NULL;
    92. }
    93. LTNode* LTFind(LTNode* phead, LTDataType x) {
    94. assert(phead);
    95. LTNode* cur = phead->next;
    96. while (cur != phead) {
    97. if (cur->data == x) {
    98. return cur;
    99. }
    100. cur = cur->next;
    101. }
    102. return NULL;
    103. }
    104. //销毁
    105. void LTDistory(LTNode* phead) {
    106. assert(phead);
    107. LTNode* cur = phead->next;
    108. while (cur != phead) {
    109. LTNode* next = cur->next;
    110. free(cur);
    111. cur = next;
    112. }
    113. free(phead);
    114. phead = NULL;
    115. }
    116. //void Distory(LTNode** pphead) {
    117. //assert(pphead&&* pphead);
    118. //LTNode* cur = (*pphead)->next;
    119. //while (cur != *pphead) {
    120. // LTNode* next = cur->next;
    121. // free(cur);
    122. // cur = next;
    123. //}
    124. //free(*pphead);
    125. //*pphead = NULL;
    126. //}
    127. //打印
    128. void LTPrint(LTNode* phead) {
    129. LTNode* cur = phead->next;
    130. while (cur != phead) {
    131. printf("%d->", cur->data);
    132. cur = cur->next;
    133. }
    134. printf("\n");
    135. }

    test.c

    1. #include"List.h"
    2. #define _CRT_SECURE_NO_WARNINGS
    3. void ListTest() {
    4. //LTNode* plist = NULL;
    5. //LTInit(&plist);
    6. LTNode* plist =LTInit();
    7. LTPushBack(plist, 1);
    8. LTPushBack(plist, 2);
    9. LTPushBack(plist, 3);
    10. LTPushBack(plist, 4);
    11. LTPrint(plist);// 1 2 3 4
    12. //LTPushFront(plist, 5);
    13. //LTPushFront(plist, 6);
    14. //LTPushFront(plist, 7);
    15. //LTPrint(plist);//7 6 5 1 2 3 4
    16. //LTPopBack(plist);
    17. //LTPopBack(plist);
    18. //LTPopBack(plist);
    19. //LTPopBack(plist);
    20. //LTPopBack(plist);
    21. //LTPopFront(plist);
    22. //LTPopFront(plist);
    23. //LTPopFront(plist);
    24. //LTPopFront(plist);
    25. //LTPopFront(plist);
    26. 测试指定位置之后插入
    27. //LTNode* find = LTFind(plist, 1);
    28. LTInsert(find, 11);
    29. //LTErase(find);
    30. //LTPrint(plist);
    31. //LTDestroy(&plist);
    32. //LTDestroy(plist);
    33. //传一级指针的时候需要手动将plist置为空
    34. plist = NULL;
    35. }
    36. int main()
    37. {
    38. ListTest();
    39. return 0;
    40. }

    “error LNK2019: 无法解析的外部符号”原因总结_lnk2019无法解析的外部符号-CSDN博客

  • 相关阅读:
    9、Spring之推断构造方法源码解析
    10个WordPress的query_posts语句使用技巧
    golang 拉取 bitbucket.org 私有库
    [HTML]js Table单击事件,获取表格行和列及单元格数值的方法
    今年天猫双11,打响电商AI时代第一枪
    字符串 (3)--- KMP 算法的扩展
    OAuth2:微服务权限校验Session共享
    npm ERR! exited with error code: 128
    初级图论
    小程序真题合集
  • 原文地址:https://blog.csdn.net/2301_77479435/article/details/133964633