• C语言笔记25 •顺序表介绍•


            数据结构是计算机存储、组织数据的⽅式。数据结构是指相互之间存在⼀种或多种特定关系
    的数据元素的集合。数据结构反映数据的内部构成,即数据由那部分构成,以什么⽅式构成,以及数据元素之间呈现的结构。也就是能够存储数据; 存储的数据能够⽅便查找。
     

    1.为什么需要数据结构

            数据结构,能够有效将数据组织和管理在一起。按照我们的⽅式任意对数据进⾏增删改查等操作。最基础的数据结构:数组。但是最基础的数据结构能够提供的操作已经不能完全满⾜复杂算法实现,所以就需要引入 顺序表。
    2.顺序表
           顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口,这就解决了数组(不能完全满足复杂算法实现)的缺点。
    3.顺序表的代码示例:
    1. // SeqList.h
    2. #pragma once
    3. #include
    4. #include
    5. #include
    6. typedef int SLDataType;
    7. typedef struct SeqList
    8. {
    9. SLDataType* arr;
    10. int size;
    11. int capacity;
    12. }SL;
    13. //typedef struct SeqList SL;
    14. //顺序表初始化
    15. void SLInit(SL* ps);
    16. //顺序表销毁头部插入
    17. void SLDestroy(SL* ps);
    18. //数据打印
    19. void SLprint(SL sl);
    20. //插入数据之前先看空间够不够
    21. void SLCheckCapacity(SL* ps);
    22. //尾部插入&头部插入
    23. //尾部插入
    24. void SLPushback(SL* ps, SLDataType x);
    25. //头部插入
    26. void SLPushFront(SL* ps, SLDataType x);
    27. //尾部删除&头部删除
    28. //尾部删除
    29. void SLPopBack(SL* ps);
    30. //头部删除
    31. void SLPopFront(SL* ps);

    1. //SeqList.c
    2. #define _CRT_SECURE_NO_WARNINGS 1
    3. #include "SeqList.h"
    4. //顺序表初始化
    5. void SLInit(SL* ps)
    6. {
    7. ps->arr = NULL;
    8. ps->size = 0;
    9. ps->capacity = 0;
    10. }
    11. //顺序表销毁
    12. void SLDestroy(SL* ps)
    13. {
    14. if (ps->arr)
    15. {
    16. free(ps->arr);
    17. }
    18. ps->arr = NULL;
    19. ps->size = 0;
    20. ps->capacity = 0;
    21. }
    22. //插入数据之前先看空间够不够
    23. void SLCheckCapacity(SL* ps)
    24. {
    25. if (ps->capacity == ps->size)//空间不够了 需要申请内存
    26. {
    27. int Newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
    28. SLDataType* temp = realloc(ps->arr, Newcapacity * sizeof(SLDataType));
    29. if (temp == NULL)
    30. {
    31. perror("realloc");
    32. exit(1);
    33. //return 1;
    34. }
    35. ps->arr = temp;//内存申请成功
    36. ps->capacity = Newcapacity;
    37. }
    38. }
    39. //数据打印
    40. void SLprint(SL sl)
    41. {
    42. for (int i = 0; i < sl.size; i++)
    43. {
    44. printf("%d ", sl.arr[i]);
    45. }
    46. printf("\n");
    47. }
    48. //尾部插入
    49. void SLPushback(SL* ps, SLDataType x)
    50. {
    51. assert(ps);
    52. SLCheckCapacity(ps);
    53. //ps->arr[ps->size] = x;
    54. //++ps->size;
    55. ps->arr[ps->size++] = x;
    56. }
    57. //头部插入
    58. void SLPushFront(SL* ps, SLDataType x)
    59. {
    60. assert(ps);
    61. SLCheckCapacity(ps);
    62. //先让顺序表中已有的数据整体往后挪动一位
    63. for (int i = ps->size;i>0; i--)
    64. {
    65. ps->arr[i] = ps->arr[i - 1];//arr[1]=arr[0]
    66. }
    67. ps->arr[0] = x;
    68. ps->size++;//长度+1
    69. }
    70. //尾部删除
    71. void SLPopBack(SL* ps)
    72. {
    73. assert(ps);
    74. ps->size--;//--ps->size
    75. }
    76. //头部删除
    77. void SLPopFront(SL* ps)
    78. {
    79. assert(ps);
    80. for (int i = 0; i < ps->size - 1; i++)
    81. {
    82. ps->arr[i] = ps->arr[i + 1];
    83. }
    84. ps->size--;
    85. }

    1. //SeqList-test.c
    2. #define _CRT_SECURE_NO_WARNINGS 1
    3. #include"SeqList.h"
    4. void test()
    5. {
    6. SL sl;
    7. SLInit(&sl);//初始化
    8. SLPushback(&sl, 1);//尾插一个数字1
    9. SLPushback(&sl, 2);//尾插一个数字1
    10. SLPushback(&sl, 3);//尾插一个数字1
    11. SLPushback(&sl, 4);//尾插一个数字1
    12. SLprint(sl);//1 2 3 4
    13. SLPushFront(&sl, 0); //头插一个数字0
    14. SLprint(sl);//0 1 2 3 4
    15. SLPopBack(&sl);//尾删一个数字
    16. SLprint(sl);//0 1 2 3
    17. SLPopFront(&sl);//头删一个数字
    18. SLprint(sl);//1 2 3
    19. SLDestroy(&sl);
    20. }
    21. int main()
    22. {
    23. test();
    24. return 0;
    25. }

  • 相关阅读:
    Python学习之CSDN21天学习挑战赛计划之5
    【剑指offer】数据结构——数
    对拍系列 v1.0
    分布式任务调度平台——XXL-JOB
    深入理解String、StringBuffer 和 StringBuilder类的区别
    一座 “数智桥梁”,华为助力“天堑变通途”
    智慧园区能源监控平台:构建绿色智能的未来城市
    【DP】Block Sequence—CF1881E
    反射和注解
    做自媒体的素材都是在哪里找的呢?
  • 原文地址:https://blog.csdn.net/qq_64446190/article/details/139756135