• 数据结构 2.2 单循环链表


    2.单循环链表
    data|next——>data|next——>data|next——>头节点
    1.初始化链表
    2.增加节点(头插法、尾插法)
    3.删除节点
    4.遍历链表

    定义一个链表(结构体),定义一个数据结构,存放data域和指针域:

    1. typedef struct Node {//定义一个结构体,存放data域和指针域
    2. int data;//数据域类型
    3. struct Node* next;
    4. }Node;//定义一个链表Node

    初始化链表:

    1. Node* initList() {//初始化链表
    2. Node* L = (Node*)malloc(sizeof(Node));//开辟空间 L:头指针
    3. L->data = 0;//data域
    4. L->next = L;//下一个节点指向
    5. return L;
    6. }

    头插法:

    1. void headInsert(Node* L, int data) {//头插法 传入头指针L
    2. Node* node = (Node*)malloc(sizeof(Node));//创建指针变量并开辟空间
    3. node->data = data;
    4. node->next = L->next;//头指针指向新节点 新节点指向原先头节点
    5. L->next = node;
    6. }

    尾插法 :

    1. void tailInsert(Node* L, int data) {//尾插法
    2. Node* n = L;//链表L
    3. Node* node = (Node*)malloc(sizeof(Node));//新建指针变量
    4. node->data = data;
    5. while (n->next != L) {//判断是否是最后一个节点
    6. n = n->next;
    7. }
    8. node->next = L;//指针变量指向L
    9. n->next = node;//n指向的next等于node
    10. }

    删除:

    1. #define TRUE 1
    2. #define FALSE 0
    3. int Delete(Node* L, int data)//删除
    4. {
    5. Node* preNode = L;//记录每次循环的前一个结点
    6. Node* node = L->next;
    7. while (node != L)
    8. {
    9. if (node->data == data) {
    10. //delete
    11. preNode->next = node->next;
    12. free(node);
    13. return TRUE;
    14. }
    15. preNode = node;//如果没有的话
    16. node = node->next;
    17. }
    18. return FALSE;
    19. }

    遍历链表:

    1. void printList(Node* L) {//遍历链表
    2. Node* node = L->next;//定义一个链表给他赋值L链表
    3. while (node != L) {//链表不为空
    4. printf("%d->", node->data);//打印
    5. node = node->next;//node指向node的next指针
    6. }
    7. printf("NULL\n");
    8. }

    main函数:

    1. int main()
    2. {
    3. Node* L = initList();
    4. headInsert(L, 1);
    5. headInsert(L, 2);
    6. headInsert(L, 3);
    7. headInsert(L, 4);
    8. headInsert(L, 5);
    9. tailInsert(L, 6);
    10. tailInsert(L, 7);
    11. tailInsert(L, 8);
    12. tailInsert(L, 9);
    13. tailInsert(L, 10);
    14. printList(L);
    15. Delete(L, 4);
    16. Delete(L, 5);
    17. printList(L);
    18. return 0;
    19. }

    单循环链表函数

    1. typedef struct Node {//定义一个结构体,存放data域和指针域
    2. int data;//数据域类型
    3. struct Node* next;
    4. }Node;
    5. Node* initList() {//初始化链表
    6. Node* L = (Node*)malloc(sizeof(Node));
    7. L->data = 0;
    8. L->next = L;
    9. return L;
    10. }
    11. void headInsert(Node* L, int data) {//头插法
    12. Node* node = (Node*)malloc(sizeof(Node));
    13. node->data = data;
    14. node->next = L->next;
    15. L->next = node;
    16. }
    17. void tailInsert(Node* L, int data) {//尾插法
    18. Node* n = L;
    19. Node* node = (Node*)malloc(sizeof(Node));
    20. node->data = data;
    21. while (n->next != L) {
    22. n = n->next;
    23. }
    24. node->next = L;
    25. n->next = node;
    26. }
    27. #define TRUE 1
    28. #define FALSE 0
    29. int Delete(Node* L, int data)//删除
    30. {
    31. Node* preNode = L;
    32. Node* node = L->next;
    33. while (node != L)
    34. {
    35. if (node->data == data) {
    36. //delete
    37. preNode->next = node->next;
    38. free(node);
    39. return TRUE;
    40. }
    41. preNode = node;
    42. node = node->next;
    43. }
    44. return FALSE;
    45. }
    46. void printList(Node* L) {//遍历链表
    47. Node* node = L->next;
    48. while (node != L) {
    49. printf("%d->", node->data);
    50. node = node->next;
    51. }
    52. printf("NULL\n");
    53. }
    54. int main()
    55. {
    56. Node* L = initList();
    57. headInsert(L, 1);
    58. headInsert(L, 2);
    59. headInsert(L, 3);
    60. headInsert(L, 4);
    61. headInsert(L, 5);
    62. tailInsert(L, 6);
    63. tailInsert(L, 7);
    64. tailInsert(L, 8);
    65. tailInsert(L, 9);
    66. tailInsert(L, 10);
    67. printList(L);
    68. Delete(L, 4);
    69. Delete(L, 5);
    70. printList(L);
    71. return 0;
    72. }

    运行结果:

  • 相关阅读:
    web前端——VUE
    大数据开发数据治理方向
    ComposeUI——下拉刷新+上拉加载(简单封装)
    【2023C卷最新题目】20天拿下华为OD笔试之【哈希表】2023C-掌握单词个数-全网注释最详细分类最全的华为OD真题题解
    14 - 多线程之锁优化(下):使用乐观锁优化并行操作
    顺序表-c语言实现
    快速理解java语言
    【C++】:引用的概念/引用的特性/常引用/引用的使用场景/传值与传引用的效率比较/引用和指针的区别/内联函数的概念/内联函数的特性
    想要转行前端开发,却不知道如何选择靠谱的培训机构
    数据挖掘实战(1):信用卡违约率分析
  • 原文地址:https://blog.csdn.net/m0_73983707/article/details/133625599