当前位置:   article > 正文

顺序表(C语言版)_顺序表c语言代码

顺序表c语言代码

顺序表是线性表的一种,顺序表分为静态顺序表和动态顺序表。

顺序表定义(静态与动态)

静态顺序表:以定长数组储存元素

  1. #define N 7
  2. typedef int SLDateType;//将int类型重新起一个别名SLDataType
  3. typedef struct SeqList
  4. {
  5. SLDateType a[N];//定长数组有效的元素
  6. size_t size;//有效的元素个数
  7. size_t capacity; // unsigned int无符号整型
  8. }SeqList;

动态顺序表:使用动态开辟的数组储存

  1. typedef int SLDateType;
  2. typedef struct SeqList
  3. {
  4. SLDateType* a;//指向动态开辟的数组
  5. size_t size;//有效元素个数
  6. size_t capacity; // 顺序表的容量
  7. }SeqList;

顺序表初始化

  1. void SeqListInit(SeqList* ps)//传入的变量为 顺序表结构体
  2. {
  3. assert(ps);//此处为断言
  4. ps->a = (SLDateType*)malloc(10 * sizeof(SLDateType));//动态申请顺序表空间
  5. if (NULL == ps->a)
  6. {
  7. printf("申请空间失败......\n");
  8. exit(0);//若申请失败则退出
  9. }
  10. ps->size = 0;//初始化有效元素个数为0
  11. ps->capacity = 10;//初始化顺序表容量为10
  12. }

其中malloc函数的头文件为  #include<stdlib.h>

malloc函数的默认返回值是void*,我们在使用时需要强转为我们所需要的(SLDataType*)

(10 * sizeof(SLDataType))代表的是我们申请了10个SLDataType类型大小的空间

而assert(ps)断言的作用是检测空指针,如果传入的ps指针是空指针,则退出程序

assert()的头文件是 #include <assert.h>

exit(0)的头文件是 #include <stdlib.h>

顺序表销毁

  1. void SeqListDestroy(SeqList* ps)
  2. {
  3. assert(ps);
  4. if (ps->a != NULL)
  5. {
  6. free(ps->a);
  7. ps->a = NULL;//free之后需要手动将指针置为NULL,防止内存泄漏
  8. ps->size = 0;//顺序表销毁之后有效元素为0
  9. ps->capacity = 0;//顺序表销毁之后顺序表容量为0
  10. }
  11. }

free()函数的作用是对动态分配的内存进行释放,但是free函数只是将参数指针指向的内存归还给操作系统,并不会把参数指针置为NULL,为了以后访问到被操作系统重新分配后的错误数据,所以在调用free之后,通常需要手动将指针置NULL。

顺序表打印

  1. void SeqListPrint(SeqList* ps)
  2. {
  3. for (int i = 0; i < ps->size; ++i)
  4. {
  5. printf("%d",ps->a[i]);
  6. }
  7. printf("\n");
  8. }

顺序表尾插

  1. void SeqListPushBack(SeqList* ps, SLDateType x)
  2. {
  3. assert(ps);
  4. ps->a[ps->size] = x;
  5. ps->size++;
  6. }

顺序表头插

  1. void SeqListPushFront(SeqList* ps, SLDateType x)
  2. {
  3. assert(ps);
  4. for (int i = ps->size-1; i >= 0; --i)
  5. {
  6. ps->a[i + 1] = ps->a[i];//顺序表中所有元素向后搬移
  7. }
  8. ps->a[0] = x;
  9. ps->size++;
  10. }

顺序表头删

  1. void SeqListPopFront(SeqList* ps)
  2. {
  3. for (int i = 0; i < ps->size; ++i)
  4. {
  5. ps->a[i] = ps->a[i + 1];
  6. }
  7. ps->size--;
  8. }

顺序表尾删

  1. void SeqListPopBack(SeqList* ps)
  2. {
  3. ps->size--;
  4. }

顺序表查找

  1. // 顺序表查找
  2. int SeqListFind(SeqList* ps, SLDateType x)
  3. {
  4. assert(ps);
  5. for (int i = 0; i < ps->size; ++i)
  6. {
  7. if (ps->a[i] == x)
  8. {
  9. printf("%d\n", i);
  10. return i;
  11. }
  12. }
  13. //如果x不在顺序表中
  14. return -1;
  15. }

顺序表在pos位置之后插入x

  1. void SeqListInsert(SeqList* ps, size_t pos, SLDateType x)
  2. {
  3. assert(ps);
  4. if (pos > ps->size)
  5. {
  6. printf("参数越界了。。。。。\n");
  7. exit(0);
  8. }
  9. for (int i = ps->size - 1; i >= pos; --i)
  10. {
  11. ps->a[i + 1] = ps->a[i];
  12. }
  13. ps->a[pos] = x;
  14. ps->size++;
  15. }

顺序表删除pos位置之后的值

  1. void SeqListErase(SeqList* ps, size_t pos)
  2. {
  3. assert(ps);
  4. if (pos > ps->size)
  5. {
  6. printf("参数越界了。。。。。\n");
  7. exit(0);
  8. }
  9. for (int i = pos + 1; i < ps->size; ++i)//将pos以及之后的所有元素整体向前搬移一个单位
  10. {
  11. ps->a[i - 1] = ps->a[i];//a[i-1]才是pos位置的元素
  12. }
  13. ps->size--;
  14. }

判断顺序表是否为空

  1. size_t SeqListEmpty(SeqList* ps)
  2. {
  3. assert(ps);
  4. return 0 == ps->size;//若为空则返回true,不为空则返回false
  5. }

全部代码:

utili.h

  1. #pragma once
  2. #include <stdio.h>
  3. #include <assert.h>
  4. #include <stdlib.h>
  5. #include <stdbool.h>
  6. typedef int SLDateType;
  7. typedef struct SeqList
  8. {
  9. SLDateType* a;
  10. size_t size;
  11. size_t capacity; // unsigned int
  12. }SeqList;
  13. // 对数据的管理:增删查改
  14. void SeqListInit(SeqList* ps);
  15. void SeqListDestroy(SeqList* ps);
  16. void SeqListPrint(SeqList* ps);
  17. void SeqListPushBack(SeqList* ps, SLDateType x);
  18. void SeqListPushFront(SeqList* ps, SLDateType x);
  19. void SeqListPopFront(SeqList* ps);
  20. void SeqListPopBack(SeqList* ps);
  21. // 顺序表查找
  22. int SeqListFind(SeqList* ps, SLDateType x);
  23. // 顺序表在pos位置之后插入x
  24. void SeqListInsert(SeqList* ps, size_t pos, SLDateType x);
  25. // 顺序表删除pos位置之后的值
  26. void SeqListErase(SeqList* ps, size_t pos);
  27. //顺序表是否为空
  28. size_t SeqListEmpty(SeqList* ps);

顺序表.c

  1. #include "utili.h"
  2. //顺序表初始化
  3. void SeqListInit(SeqList* ps)
  4. {
  5. assert(ps);
  6. ps->a = (SLDateType*)malloc(10 * sizeof(SLDateType));
  7. if (NULL == ps->a)
  8. {
  9. printf("申请空间失败......\n");
  10. exit(0);
  11. }
  12. ps->size = 0;
  13. ps->capacity = 10;
  14. }
  15. //顺序表销毁
  16. void SeqListDestroy(SeqList* ps)
  17. {
  18. assert(ps);
  19. if (ps->a != NULL)
  20. {
  21. free(ps->a);
  22. ps->a = NULL;
  23. ps->size = 0;
  24. ps->capacity = 0;
  25. }
  26. }
  27. //顺序表打印
  28. void SeqListPrint(SeqList* ps)
  29. {
  30. for (int i = 0; i < ps->size; ++i)
  31. {
  32. printf("%d",ps->a[i]);
  33. }
  34. printf("\n");
  35. }
  36. //顺序表尾插
  37. void SeqListPushBack(SeqList* ps, SLDateType x)
  38. {
  39. assert(ps);
  40. ps->a[ps->size] = x;
  41. ps->size++;
  42. }
  43. //顺序表头插
  44. void SeqListPushFront(SeqList* ps, SLDateType x)
  45. {
  46. assert(ps);
  47. for (int i = ps->size-1; i >= 0; --i)
  48. {
  49. ps->a[i + 1] = ps->a[i];
  50. }
  51. ps->a[0] = x;
  52. ps->size++;
  53. }
  54. //顺序表头删
  55. void SeqListPopFront(SeqList* ps)
  56. {
  57. for (int i = 0; i < ps->size; ++i)
  58. {
  59. ps->a[i] = ps->a[i + 1];
  60. }
  61. ps->size--;
  62. }
  63. //顺序表尾删
  64. void SeqListPopBack(SeqList* ps)
  65. {
  66. ps->size--;
  67. }
  68. // 顺序表查找
  69. int SeqListFind(SeqList* ps, SLDateType x)
  70. {
  71. assert(ps);
  72. for (int i = 0; i < ps->size; ++i)
  73. {
  74. if (ps->a[i] == x)
  75. {
  76. printf("%d\n", i);
  77. return i;
  78. }
  79. }
  80. //如果x不在顺序表中
  81. return -1;
  82. }
  83. // 顺序表在pos位置之后插入x
  84. void SeqListInsert(SeqList* ps, size_t pos, SLDateType x)
  85. {
  86. assert(ps);
  87. if (pos > ps->size)
  88. {
  89. printf("参数越界了。。。。。\n");
  90. exit(0);
  91. }
  92. for (int i = ps->size - 1; i >= pos; --i)
  93. {
  94. ps->a[i + 1] = ps->a[i];
  95. }
  96. ps->a[pos] = x;
  97. ps->size++;
  98. }
  99. // 顺序表删除pos位置之后的值
  100. void SeqListErase(SeqList* ps, size_t pos)
  101. {
  102. assert(ps);
  103. if (pos > ps->size)
  104. {
  105. printf("参数越界了。。。。。\n");
  106. exit(0);
  107. }
  108. for (int i = pos + 1; i < ps->size; ++i)
  109. {
  110. ps->a[i - 1] = ps->a[i];
  111. }
  112. ps->size--;
  113. }
  114. //判断顺序表是否为空
  115. size_t SeqListEmpty(SeqList* ps)
  116. {
  117. assert(ps);
  118. return 0 == ps->size;
  119. }

测试代码部分:

  1. #include "utili.h"
  2. int main()
  3. {
  4. SeqList s = {NULL,0,0};//定义一个顺序表
  5. SeqListInit(&s);//顺序表初始化
  6. SeqListPushBack(&s, 1);//尾插一个元素 1
  7. SeqListPushBack(&s, 2);//尾插一个元素 2
  8. SeqListPushBack(&s, 3);//尾插一个元素 3
  9. SeqListPushBack(&s, 4);//尾插一个元素 4
  10. SeqListPushBack(&s, 5);//尾插一个元素 5
  11. SeqListPrint(&s);//打印此时的顺序表
  12. SeqListPushBack(&s,6);//尾插一个元素 6
  13. SeqListPrint(&s);//打印此时的顺序表
  14. SeqListPushFront(&s,0);//头插一个元素 0
  15. SeqListPrint(&s);//打印此时的顺序表
  16. SeqListPopFront(&s);//删除第一个元素 0
  17. SeqListPrint(&s);//打印此时的顺序表
  18. SeqListPopBack(&s);//删除最后一个元素 6
  19. SeqListPrint(&s);//打印此时的顺序表
  20. SeqListFind(&s,1);//查找元素1,并返回其所在的下标
  21. SeqListInsert(&s,3,6);//在第三个位置后插入新元素6(下标为3的位置)
  22. SeqListPrint(&s);//打印此时的顺序表
  23. SeqListErase(&s,1);//删除第一个位置之后的元素(下标为1)
  24. SeqListPrint(&s);//打印此时的顺序表
  25. SeqListDestroy(&s);//销毁顺序表
  26. return 0;
  27. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/426515
推荐阅读
相关标签
  

闽ICP备14008679号