• c语言练习题82:顺序表的使用


    顺序表的使用

    1、顺序表的概念及结构

    线性表

    线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使 ⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串...

    线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储。

    顺序表和数组的区别

    ◦ 顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝

    • 顺序表分类

    ◦ 静态顺序表 概念:使⽤定⻓数组存储元素

    ◦ 动态顺序表

    2、动态顺序表的实现

    Seqlist.c 

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include"SeqList.h"
    3. void SLInit(SL* ps) {
    4. ps->a = NULL;
    5. ps->capacity = ps->size = 0;//也可在初始化时开辟空间
    6. }
    7. void SLDestory(SL* ps) {
    8. if (ps->a) {
    9. free(ps->a);
    10. }
    11. ps->a = NULL;
    12. ps->capacity = ps->size = 0;
    13. }
    14. void SLCheckCapacity(SL* ps) {
    15. //空间足够直接尾插
    16. //空间不够则进行扩容
    17. if (ps->size == ps->capacity) {
    18. //空间不够则进行扩容(relloc申请失败返回空指针)
    19. int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
    20. SLDataType* tmp = (SLDataType*)realloc(ps->a, newCapacity * 2 * sizeof(SLDataType));
    21. if (tmp == NULL) {
    22. perror("relloc fail\n");
    23. return 1;
    24. }
    25. ps->a = tmp;
    26. ps->capacity = newCapacity;
    27. }
    28. }
    29. void SLPushBack(SL* ps, SLDataType x){
    30. assert(ps != NULL);
    31. //空间足够直接尾插
    32. //空间不够则进行扩容(relloc申请失败返回空指针)
    33. SLCheckCapacity(ps);
    34. //直接插入数据
    35. ps->a[ps->size] = x;//ps->a[ps->size++] = x;
    36. ps->size++;
    37. }
    38. void SLPushFront(SL* ps, SLDataType x) {
    39. assert(ps);
    40. //判断空间是否足够不够则扩容
    41. SLCheckCapacity(ps);
    42. for (size_t i = ps->size; i > 0; i--) {
    43. ps->a[i] = ps->a[i - 1];
    44. }
    45. ps->a[0] = x;
    46. ps->size++;
    47. }
    48. void SLPopBack(SL* ps) {
    49. assert(ps);
    50. assert(!SLIsEmpty(ps));//assert(ps->size)也可以
    51. //ps->a[ps->size - 1] = 0;//(可有可无)
    52. ps->size--;//size最初为0,为0则不能减减
    53. }
    54. void SLPopFront(SL* ps, SLDataType x) {
    55. assert(ps);
    56. assert(!SLIsEmpty(ps));//进行判空操作,不为空才能继续
    57. //让后面数据往前挪一位
    58. for (size_t i = 0; i < ps->size-1; i++) {//size_t为无符号整形
    59. //最后一次进来i为ps->size-2
    60. ps->a[i] = ps->a[i + 1];
    61. }
    62. ps->size--;
    63. }
    64. void SLPrint(SL* ps) {
    65. for (size_t i = 0; i < ps->size; i++) {
    66. printf("%d ", ps->a[i]);
    67. }
    68. printf("\n");
    69. }
    70. bool SLIsEmpty(SL* ps) {
    71. assert(ps);
    72. return ps->size == 0;//当前数据表有效数据位0,则当前数据表为空
    73. }
    74. //在指定位置之前插入数据
    75. void SLInsert(SL* ps, int pos, SLDataType x) {
    76. assert(ps);
    77. //对pos加以限制
    78. assert(pos >= 0 && pos <= ps->size);
    79. //扩容
    80. SLCheckCapacity(ps);
    81. //把pos位置及以后的数据往后挪动一位
    82. //循环里i的初始值可以为size或size-1k,但不同的初始值对应不同的结束条件
    83. /*for (size_t i = ps->size; i > pos; i--) {
    84. ps->a[i] = ps->a[i - 1];
    85. }*/
    86. for (size_t i = ps->size-1; i > pos-1; i--) {
    87. ps->a[i+1] = ps->a[i];
    88. }
    89. ps->a[pos] = x;
    90. ps->size++;
    91. }
    92. //删除指定位置的数据
    93. void SLErase(SL* ps, int pos) {
    94. assert(ps);
    95. assert(!SLIsEmpty(ps));//进行判空操作,不为空才能继续
    96. //对pos加以限制
    97. assert(pos >= 0 && pos <= ps->size);
    98. for (int i = pos; i < ps->size - 1; i++) {
    99. //最后一次进来的i的数据为ps->size - 2
    100. ps->a[i] = ps->a[i + 1];
    101. }
    102. ps->size--;
    103. }
    104. bool SLFind(SL* ps, SLDataType x) {
    105. assert(ps);
    106. for (int i = 0; i < ps->size; i++) {
    107. if (ps->a[i] == x) {
    108. //找到了
    109. return true;
    110. }
    111. }
    112. return false;
    113. }

    test.c

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include"SeqList.h"
    3. void SLtest() {
    4. SL sl;
    5. SLInit(&sl);
    6. //尾部插入
    7. SLPushBack(&sl, 1);
    8. SLPushBack(&sl, 2);
    9. SLPushBack(&sl, 3);
    10. SLPushBack(&sl, 4);
    11. SLPrint(&sl);
    12. //头部插入
    13. SLPushFront(&sl, 5);
    14. SLPushFront(&sl, 6);
    15. SLPushFront(&sl, 7);
    16. SLPrint(&sl);
    17. SLPopBack(&sl);
    18. SLPrint(&sl);
    19. SLPopBack(&sl);
    20. SLPrint(&sl);
    21. SLDestory(&sl);
    22. }
    23. void SLtest02() {
    24. SL sl;
    25. SLInit(&sl);
    26. //尾部插入
    27. SLPushBack(&sl, 1);
    28. SLPushBack(&sl, 2);
    29. SLPushBack(&sl, 3);
    30. SLPushBack(&sl, 4);
    31. SLPrint(&sl);
    32. 头删
    33. //SLPopFront(&sl);
    34. //SLPrint(&sl);
    35. //SLPopFront(&sl);
    36. //SLPrint(&sl);
    37. //SLDestory(&sl);
    38. //在指定位置之前插入数据
    39. /*SLInsert(&sl, 1, 11);
    40. SLPrint(&sl);
    41. SLDestory(&sl);*/
    42. 删除指定位置的数据
    43. //SLErase(&sl, 0);
    44. //SLPrint(&sl);
    45. //SLErase(&sl, sl.size-1);
    46. //SLPrint(&sl);
    47. //
    48. bool findRet=SLFind(&sl, 3);
    49. if (findRet) {
    50. printf("找到了\n");
    51. }
    52. else {
    53. printf("没有找到!\n");
    54. }
    55. SLDestory(&sl);
    56. }
    57. int main() {
    58. //SLtest();
    59. SLtest02();
    60. return 0;
    61. }

    Seqlist.h

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include
    3. #include
    4. #include
    5. #include
    6. typedef int SLDataType;
    7. typedef struct SeqList
    8. {
    9. SLDataType* a;
    10. int size;//顺序表中有效的数据格式
    11. int capacity;//顺序表当前的空间大小
    12. }SL;
    13. //typedef struct SeqList SL(即为)
    14. //对顺序表进行初始化
    15. void SLInit(SL* ps);
    16. //对顺序表进行销毁
    17. void SLDestory(SL* ps);
    18. //尾部插入
    19. void SLPushBack(SL* ps, SLDataType x);
    20. //头部插入
    21. void SLPushFront(SL* ps, SLDataType x);
    22. //尾部删除
    23. void SLPopBack(SL* ps);
    24. //头部删除
    25. void SLPopFront(SL* ps);
    26. //打印
    27. void SLPrint(SL* ps);
    28. //判断顺序表是否位空
    29. bool SLIsEmpty(SL* ps);
    30. //在任意位置插入删除
    31. //在指定位置之前插入数据
    32. void SLInsert(SL* ps, int pos, SLDataType x);
    33. //删除指定位置的数据
    34. void SLErase(SL* ps, int pos);
    35. bool SLFind(SL* ps, SLDataType x);
    36. //判断空间是否足够,不够则进行扩容
    37. void SLCheckCapacity(SL* ps);

  • 相关阅读:
    Java反射机制
    Python常见英语单词700+(建议收藏)
    LeetCode中等题之替换字符串中的括号内容
    Redis8 实现分布式锁
    minio之docker安装
    关于AbstractQueuedSynchronizer(JDK1.8)的一点理解.
    001:你好Direct 2D! 在对话框中初次使用D2D
    介词练习题
    【仿牛客网笔记】Spring Boot实践,开发社区登录模块-显示登录信息
    java计算机毕业设计开放式体育社区及论坛源码+系统+数据库+lw文档
  • 原文地址:https://blog.csdn.net/2301_77479435/article/details/133708406