• 【单链表】无头单项不循环(2)


    目录

    Test.c主函数

    test5

    test6

    test7

    test8

    test9

    Test.c总代码

    SList.h头文件&函数声明

    头文件

    函数声明

    SList.h总代码

    SList.c函数实现

    查询SLFind 

    pos前面插入  

    pos后面插入

    pos后面删除

    pos删除

    空间释放

    SList.c总代码


    今天链表。 

    Test.c主函数

    #include"SList.h"
    1. int main()
    2. {
    3. SLNode* phead = NULL;//结构体指针变量存放结构体的地址 头节点
    4. test5(&phead);//测试查找
    5. test6(&phead);//测试在pos前面插入
    6. test7(&phead);//测试在pos后面插入
    7. test8(&phead);//测试删除pos后面的元素
    8. test9(&phead);//测试删除pos的元素
    9. return 0;
    10. }

    test5

    1. void test5(SLNode** pphead)//测试查找
    2. {
    3. SLNode*ret=SLFind(*pphead, 77);
    4. if (ret != NULL)
    5. {
    6. printf("找到了:%d\n", ret->val);
    7. }
    8. else
    9. {
    10. printf("没找到\n");
    11. }
    12. }

    test6

    1. void test6(SLNode** pphead)//测试在pos前面位置插入的元素
    2. {
    3. SLNode* ret = SLFind(*pphead, 77);
    4. SLInsert(pphead, ret, 34);
    5. SLNode* pos = SLFind(*pphead, 34);
    6. SLInsert(pphead, pos, 78);
    7. SLPrint(*pphead);
    8. }

    test7

    1. void test7(SLNode** pphead)//测试在pos后面位置插入的元素
    2. {
    3. SLNode* ret = SLFind(*pphead, 77);
    4. SLInsertAfter(pphead, ret, 99);
    5. SLPrint(*pphead);
    6. }

    test8

    1. void test8(SLNode** pphead)//测试删除pos后面的元素
    2. {
    3. SLNode* ret = SLFind(*pphead, 77);
    4. SLEraseAfter(pphead, ret);//99
    5. SLPrint(*pphead);
    6. }

    test9

    1. void test9(SLNode** pphead)//测试删除pos的元素
    2. {
    3. SLNode* ret = SLFind(*pphead, 78);
    4. SLErase(pphead, ret);
    5. SLPrint(*pphead);
    6. }

    Test.c总代码

    1. #include"SList.h"
    2. void test1(SLNode** pphead)//测试尾插
    3. {
    4. SLPushBack(pphead, 10);
    5. SLPushBack(pphead, 20);
    6. SLPushBack(pphead, 30);
    7. SLPushBack(pphead, 40);
    8. SLPrint(*pphead);
    9. }
    10. void test2(SLNode** pphead)//测试头插
    11. {
    12. SLPushFront(pphead, 77);
    13. SLPushFront(pphead, 66);
    14. SLPushFront(pphead, 55);
    15. SLPushFront(pphead, 33);
    16. SLPrint(*pphead);
    17. }
    18. //
    19. void test3(SLNode** pphead)//测试头删
    20. {
    21. SLPopFront(pphead);
    22. SLPopFront(pphead);
    23. SLPopFront(pphead);
    24. SLPrint(*pphead);
    25. }
    26. void test4(SLNode** pphead)//测试尾删
    27. {
    28. SLPopBack(pphead);
    29. SLPopBack(pphead);
    30. SLPrint(*pphead);
    31. }
    32. void test5(SLNode** pphead)//测试查找
    33. {
    34. SLNode*ret=SLFind(*pphead, 77);
    35. if (ret != NULL)
    36. {
    37. printf("找到了:%d\n", ret->val);
    38. }
    39. else
    40. {
    41. printf("没找到\n");
    42. }
    43. }
    44. void test6(SLNode** pphead)//测试在pos前面位置插入的元素
    45. {
    46. SLNode* ret = SLFind(*pphead, 77);
    47. SLInsert(pphead, ret, 34);
    48. SLNode* pos = SLFind(*pphead, 34);
    49. SLInsert(pphead, pos, 78);
    50. SLPrint(*pphead);
    51. }
    52. void test7(SLNode** pphead)//测试在pos后面位置插入的元素
    53. {
    54. SLNode* ret = SLFind(*pphead, 77);
    55. SLInsertAfter(pphead, ret, 99);
    56. SLPrint(*pphead);
    57. }
    58. void test8(SLNode** pphead)//测试删除pos后面的元素
    59. {
    60. SLNode* ret = SLFind(*pphead, 77);
    61. SLEraseAfter(pphead, ret);//99
    62. SLPrint(*pphead);
    63. }
    64. void test9(SLNode** pphead)//测试删除pos的元素
    65. {
    66. SLNode* ret = SLFind(*pphead, 78);
    67. SLErase(pphead, ret);
    68. SLPrint(*pphead);
    69. }
    70. int main()
    71. {
    72. SLNode* phead = NULL;//结构体指针变量存放结构体的地址 头节点
    73. test1(&phead);//测试尾插
    74. test2(&phead);//测试头插
    75. test3(&phead);//测试尾删
    76. test4(&phead);//测试头删
    77. test5(&phead);//测试查找
    78. test6(&phead);//测试在pos前面插入
    79. test7(&phead);//测试在pos后面插入
    80. test8(&phead);//测试删除pos后面的元素
    81. test9(&phead);//测试删除pos的元素
    82. return 0;
    83. }

    SList.h头文件&函数声明

    头文件

    1. #pragma once
    2. #include
    3. #include
    4. #include

    函数声明

    • 单链表元素查询 
    1. //找到某个数值在单链表
    2. SLNode* SLFind(SLNode* phead, SLNDataType x);
    •  在pos前面位置插入元素
    1. //在pos的前面插入
    2. void SLInsert(SLNode** pphead, SLNode*pos,SLNDataType x);
    • 在pos后面插入元素 
    1. //在pos的后面插入
    2. void SLInsertAfter(SLNode** pphead, SLNode* pos, SLNDataType x);
    •  删除pos后面的位置的元素
    1. //删除pos的后面位置
    2. void SLEraseAfter(SLNode** pphead, SLNode* pos);
    • 删除pos位置的元素 
    1. //删除pos位置
    2. void SLErase(SLNode** pphead, SLNode* pos);
    •  空间释放
    1. //空间释放
    2. void SLDestroy(SLNode** pphead);

    SList.h总代码

    1. #pragma once
    2. #include
    3. #include
    4. #include
    5. //创建单链表
    6. typedef int SLNDataType;//单链表节点数据类型
    7. typedef struct SListNode//创建节点
    8. {
    9. SLNDataType val;
    10. struct SListNode* next;
    11. }SLNode;
    12. //打印数据
    13. void SLPrint(SLNode* phead);
    14. //尾插
    15. void SLPushBack(SLNode** pphead, SLNDataType x);
    16. //头插
    17. void SLPushFront(SLNode** pphead, SLNDataType x);
    18. //头删
    19. void SLPopFront(SLNode** pphead);
    20. //尾删
    21. void SLPopBack(SLNode** pphead);
    22. //找到某个数值在单链表
    23. SLNode* SLFind(SLNode* phead, SLNDataType x);
    24. //在pos的前面插入
    25. void SLInsert(SLNode** pphead, SLNode*pos,SLNDataType x);
    26. //在pos的后面插入
    27. void SLInsertAfter(SLNode** pphead, SLNode* pos, SLNDataType x);
    28. //删除pos的后面位置
    29. void SLEraseAfter(SLNode** pphead, SLNode* pos);
    30. //删除pos位置
    31. void SLErase(SLNode** pphead, SLNode* pos);
    32. //空间释放
    33. void SLDestroy(SLNode** pphead);

    SList.c函数实现

    查询SLFind 

    1. //在单链表中查找某个数字
    2. //找到了返回这个链表的地址
    3. //没找到返回NULL
    4. SLNode* SLFind(SLNode* phead, SLNDataType x)
    5. {
    6. SLNode* cur = phead;
    7. while(cur)
    8. {
    9. if (cur->val == x)
    10. {
    11. return cur;
    12. }
    13. cur = cur->next;
    14. }
    15. return NULL;
    16. }

    pos前面插入  

    1. //在pos的前面插入
    2. void SLInsert(SLNode** pphead, SLNode*pos,SLNDataType x)
    3. {
    4. //严格限定单链表里面必须有一个有效节点
    5. assert(pphead);//应该没有人喝醉酒了吧
    6. assert(*pphead);
    7. assert(pos);
    8. SLNode* newnode = CreateNode(x);
    9. SLNode* cur = *pphead;
    10. SLNode* prve = NULL;
    11. //适合中间和尾
    12. if (prve)
    13. {
    14. while (cur != pos)
    15. {
    16. prve = cur;
    17. cur = cur->next;
    18. }
    19. prve->next = newnode;
    20. newnode->next = cur;
    21. }
    22. else
    23. {
    24. //头插
    25. SLPushFront(pphead, x);
    26. }
    27. }

    pos后面插入

    1. //在pos的后面插入
    2. void SLInsertAfter(SLNode** pphead, SLNode* pos, SLNDataType x)
    3. {
    4. //严格限定单链表里面必须有一个有效节点
    5. assert(pphead);//应该没有人喝醉酒了吧
    6. assert(*pphead);
    7. assert(pos);
    8. SLNode* newnode = CreateNode(x);
    9. newnode->next = pos->next;
    10. pos->next = newnode;
    11. //头和尾都不用处理。
    12. }

    pos后面删除

    1. //删除pos的后面位置
    2. void SLEraseAfter(SLNode** pphead, SLNode* pos)
    3. {
    4. //pos在最后一个不可
    5. assert(pos->next);
    6. assert(pos);
    7. SLNode* tmp = pos->next;
    8. pos->next = pos->next->next;
    9. free(tmp);
    10. tmp = NULL;
    11. }

    pos删除

    1. //删除pos位置
    2. void SLErase(SLNode** pphead, SLNode* pos)
    3. {
    4. assert(pos);
    5. SLNode* cur = *pphead;
    6. SLNode* prve = NULL;
    7. if (prve)
    8. {
    9. while (cur != pos)
    10. {
    11. prve = cur;
    12. cur = cur->next;
    13. }
    14. prve->next = cur->next;
    15. free(pos);
    16. pos = NULL;
    17. }
    18. else
    19. {
    20. *pphead = pos->next;
    21. free(pos);
    22. pos = NULL;
    23. }
    24. }

     

    空间释放

    1. //空间释放
    2. void SLDestroy(SLNode** pphead)
    3. {
    4. assert(*pphead);
    5. SLNode* cur = *pphead;
    6. while (cur)
    7. {
    8. SLNode* tmp = cur->next;
    9. free(cur);
    10. cur = tmp;//cur=cur->next
    11. }
    12. }

    SList.c总代码

    1. #include"SList.h"
    2. void SLPrint(SLNode* phead)
    3. {
    4. assert(phead);
    5. SLNode* tail = phead;
    6. printf("phead->");
    7. while (tail->next != NULL)
    8. {
    9. printf("%d->", tail->val);
    10. tail = tail->next;
    11. }
    12. printf("NULL");
    13. printf("\n");
    14. }
    15. //创建链表的节点---结构体
    16. SLNode* CreateNode(SLNDataType x)
    17. {
    18. SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));
    19. if (newnode == NULL)
    20. {
    21. perror("malloc");
    22. return;
    23. }
    24. newnode->val = x;
    25. newnode->next = NULL;
    26. return newnode;
    27. }
    28. //测试尾插
    29. void SLPushBack(SLNode** pphead, SLNDataType x)
    30. {
    31. //assert(*pphead);
    32. SLNode* newnode = CreateNode(x);
    33. //无节点
    34. if (*pphead == NULL)
    35. {
    36. *pphead = newnode;
    37. }
    38. //多个节点
    39. else
    40. {
    41. SLNode* tail = *pphead;
    42. while (tail->next != NULL)
    43. {
    44. tail = tail->next;
    45. }
    46. tail->next = newnode;
    47. }
    48. }
    49. //头插
    50. void SLPushFront(SLNode** pphead, SLNDataType x)
    51. {
    52. //assert(*pphead);
    53. SLNode* newnode = CreateNode(x);
    54. newnode->next = *pphead;
    55. *pphead = newnode;
    56. }
    57. //---删除就涉及空间的释放---断言(删过头)
    58. //头删
    59. void SLPopFront(SLNode** pphead)
    60. {
    61. assert(*pphead);
    62. SLNode* tail = *pphead;
    63. *pphead = (*pphead)->next;
    64. free(tail);
    65. tail = NULL;
    66. }
    67. //尾删
    68. void SLPopBack(SLNode** pphead)
    69. {
    70. assert(*pphead);
    71. //一个节点
    72. if ((*pphead)->next == NULL)
    73. {
    74. free(*pphead);
    75. *pphead = NULL;
    76. }
    77. else
    78. {
    79. SLNode* tail = *pphead;
    80. SLNode* prve = NULL;//虽然这里prve置为NULL和tail都是一样,但是在OJ题目当中会出错
    81. while (tail->next != NULL)
    82. {
    83. prve = tail;
    84. tail = tail->next;
    85. }
    86. prve->next = NULL;
    87. free(tail);
    88. tail = NULL;
    89. }
    90. }
    91. //在单链表中查找某个数字
    92. //找到了返回这个链表的地址
    93. //没找到返回NULL
    94. SLNode* SLFind(SLNode* phead, SLNDataType x)
    95. {
    96. SLNode* cur = phead;
    97. while(cur)
    98. {
    99. if (cur->val == x)
    100. {
    101. return cur;
    102. }
    103. cur = cur->next;
    104. }
    105. return NULL;
    106. }
    107. //在pos的前面插入
    108. void SLInsert(SLNode** pphead, SLNode*pos,SLNDataType x)
    109. {
    110. //严格限定单链表里面必须有一个有效节点
    111. assert(pphead);//应该没有人喝醉酒了吧
    112. assert(*pphead);
    113. assert(pos);
    114. SLNode* newnode = CreateNode(x);
    115. SLNode* cur = *pphead;
    116. SLNode* prve = NULL;
    117. //适合中间和尾
    118. if (prve)
    119. {
    120. while (cur != pos)
    121. {
    122. prve = cur;
    123. cur = cur->next;
    124. }
    125. prve->next = newnode;
    126. newnode->next = cur;
    127. }
    128. else
    129. {
    130. //头插
    131. SLPushFront(pphead, x);
    132. }
    133. }
    134. //在pos的后面插入
    135. void SLInsertAfter(SLNode** pphead, SLNode* pos, SLNDataType x)
    136. {
    137. //严格限定单链表里面必须有一个有效节点
    138. assert(pphead);//应该没有人喝醉酒了吧
    139. assert(*pphead);
    140. assert(pos);
    141. SLNode* newnode = CreateNode(x);
    142. newnode->next = pos->next;
    143. pos->next = newnode;
    144. //头和尾都不用处理。
    145. }
    146. //删除pos的后面位置
    147. void SLEraseAfter(SLNode** pphead, SLNode* pos)
    148. {
    149. //pos在最后一个不可
    150. assert(pos->next);
    151. assert(pos);
    152. SLNode* tmp = pos->next;
    153. pos->next = pos->next->next;
    154. free(tmp);
    155. tmp = NULL;
    156. }
    157. //删除pos位置
    158. void SLErase(SLNode** pphead, SLNode* pos)
    159. {
    160. assert(pos);
    161. SLNode* cur = *pphead;
    162. SLNode* prve = NULL;
    163. if (prve)
    164. {
    165. while (cur != pos)
    166. {
    167. prve = cur;
    168. cur = cur->next;
    169. }
    170. prve->next = cur->next;
    171. free(pos);
    172. pos = NULL;
    173. }
    174. else
    175. {
    176. *pphead = pos->next;
    177. free(pos);
    178. pos = NULL;
    179. }
    180. }
    181. //空间释放
    182. void SLDestroy(SLNode** pphead)
    183. {
    184. assert(*pphead);
    185. SLNode* cur = *pphead;
    186. while (cur)
    187. {
    188. SLNode* tmp = cur->next;
    189. free(cur);
    190. cur = tmp;//cur=cur->next
    191. }
    192. }

     

    最近改bug改的想砸电脑,保持冷静。下篇博客我们将继续链表其他类型。好好学习,天天向上。

    代码---------→【唐棣棣 (TSQXG) - Gitee.com

    联系---------→【邮箱:2784139418@qq.com】

  • 相关阅读:
    恩智浦半导体基于离子阱研发“经典+量子”解决方案
    django 内置 JSON 字段 使用场景
    【python基础】文件和异常详解:使用、读取、写入、追加、保存用户的信息,以及优雅的处理异常
    Java类加载过程
    可视化3个10分类
    Maven 使用教程(二)
    利用 Kubernetes 降本增效?EasyMR 基于 Kubernetes 部署的探索实践
    odoo 云部署
    Pyqt常用代码片段
    K8s 之 节点亲和性的调度策略(NodeAffinity)
  • 原文地址:https://blog.csdn.net/m0_74841364/article/details/134253831