• 【C】单链表


    目录

    单链表

            头文件

            源文件

    相关练习


    单链表

    链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表
    中的指针链接次序实现的 。

            头文件

    1. #pragma once
    2. #include<stdio.h>
    3. #include<stdlib.h>
    4. #include<assert.h>
    5. typedef int SLTDataType;
    6. typedef struct SListNode
    7. {
    8. SLTDataType data;//数据
    9. struct SListNode* next;//下一个节点
    10. }SLTNode;
    11. void SListPrint(SLTNode** pphead);//打印链表
    12. void SListDestroy(SLTNode** pphead);//释放链表
    13. void SListPushFront(SLTNode** pphead, SLTDataType x);//头插
    14. void SListPushBack(SLTNode** pphead, SLTDataType x);//尾插
    15. void SListPopFront(SLTNode** pphead);//头删
    16. void SListPopBack(SLTNode** pphead);//尾删
    17. SLTNode* SListFind(SLTNode** pphead, SLTDataType x);//查找指定的值,返回地址
    18. void SListInsertAfter(SLTNode** pphead, SLTNode* pos, SLTDataType x);//在 pos 后插入数据
    19. void SListEraseAfter(SLTNode** pphead, SLTNode* pos);//删除 pos 的后一个数据

            源文件

    1. #include"SList.h"
    2. void SListPrint(SLTNode** pphead)//打印链表
    3. {
    4. assert(pphead);
    5. SLTNode* cur = *pphead;
    6. while (cur)
    7. {
    8. printf("%d ", cur->data);
    9. cur = cur->next;
    10. }
    11. printf("\n");
    12. }
    13. void SListDestroy(SLTNode** pphead)//释放链表
    14. {
    15. assert(pphead);
    16. SLTNode* cur = *pphead;
    17. while (cur)
    18. {
    19. SLTNode* del = cur;//保存当前节点
    20. cur = cur->next;
    21. free(del);
    22. del = NULL;
    23. }
    24. *pphead = NULL;
    25. }
    26. SLTNode* BuySLTNode(SLTDataType x)//创建新节点
    27. {
    28. SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
    29. assert(newnode);//判断是否开辟空间失败
    30. newnode->next = NULL;
    31. newnode->data = x;
    32. return newnode;
    33. }
    34. void SListPushFront(SLTNode** pphead, SLTDataType x)//头插
    35. {
    36. assert(pphead);
    37. SLTNode* newnode = BuySLTNode(x);
    38. newnode->next = *pphead;
    39. *pphead = newnode;
    40. }
    41. void SListPushBack(SLTNode** pphead, SLTDataType x)//尾插
    42. {
    43. assert(pphead);
    44. SLTNode* newnode = BuySLTNode(x);
    45. //当链表为空时,新节点即为头节点
    46. if (*pphead == NULL)
    47. {
    48. *pphead = newnode;
    49. return;
    50. }
    51. //当链表不为空,找到最后一个节点
    52. SLTNode* cur = *pphead;
    53. while (cur->next)
    54. {
    55. cur = cur->next;
    56. }
    57. cur->next = newnode;
    58. }
    59. void SListPopFront(SLTNode** pphead)//头删
    60. {
    61. assert(pphead);
    62. if (*pphead == NULL)
    63. return;
    64. SLTNode* del = *pphead;//保存头结点
    65. *pphead = (*pphead)->next;//更改头节点为下一个节点
    66. free(del);//删除头结点
    67. del = NULL;
    68. }
    69. void SListPopBack(SLTNode** pphead)//尾删
    70. {
    71. assert(pphead);
    72. SLTNode* cur = *pphead;
    73. if (cur == NULL)
    74. return;
    75. //当只有一个节点时,直接调用头删
    76. if (cur->next == NULL)
    77. {
    78. SListPopFront(pphead);
    79. return;
    80. }
    81. //当有多个节点时,需找倒数第二个节点
    82. while (cur->next->next != NU
  • 相关阅读:
    30V-STM32设计项目
    机器人工程考研难易主观感受和客观数据
    Eth-Trunk链路聚合理论
    猿创征文|提升日常工作效率的软件工具分享
    Java并发常见面试题(一)
    分布式互斥
    探索 C++20 的新领域:深入理解 static关键字和核心语言特性测试宏
    uniapp微信小程序局部刷新,无感刷新,修改哪条数据刷新哪条
    OpenHarmony图片处理——XmlGraphicsBatik
    TCP协议:如何保证页面文件能被完整送达浏览器?
  • 原文地址:https://blog.csdn.net/Domeecky/article/details/126805873