• 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. }

  • 相关阅读:
    JVM的故事—— 内存分配策略
    Spring Boot整合Swagger
    Linux驱动开发十六.input系统——3.系统自带的input驱动
    自学Python 58 Socket套接字编程 (一)
    客户端性能优化实践
    C语言大型工程框架设计之设备管理
    经纬高坐标转东北天坐标
    数据可视化之百变柱状图
    Leetcode_47:全排列 II
    C++ · 手把手教你写一个扫雷小游戏
  • 原文地址:https://blog.csdn.net/qq_64446190/article/details/139756135