当前位置:   article > 正文

【零基础学数据结构】顺序表

【零基础学数据结构】顺序表

目录

1.了解数据结构

什么是数据结构? 

为什么要进行数据管理? 

2.顺序表 

顺序表概要解析: 

​编辑顺序表的分类: 

差别和使用优先度: 

1.创建顺序表

1.1顺序表分为静态顺序表和动态顺序表

 1.2顺序表的初始化

 1.3顺序表的销毁

 1.4顺序表的打印

 1.5顺序表的扩容

1.6顺序表的头插,尾插

 1.6.1头插

1.6.2尾插

 1.7顺序表的头删,尾删

 1.7.1头删

1.7.2尾删

 1.8顺序表在指定位置之前插入,删除数据

 1.8.1 插入数据

1.8.2 删除数据

 1.9顺序表数据的查找

 测试代码:


 

1.了解数据结构

什么是数据结构? 

为什么要进行数据管理? 

 

2.顺序表 

顺序表概要解析: 

顺序表的分类: 

  • 静态顺序表
  • 动态顺序表 

差别和使用优先度: 

1.创建顺序表

1.1顺序表分为静态顺序表和动态顺序表

  1. // 设定类型为一个全新名字,方便后续更改
  2. typedef int SLDataType;
  3. // 静态顺序表
  4. #define N 100
  5. typedef struct SeqList
  6. {
  7. SLDataType arr[N];//创建数组储存数据
  8. int size; //有效数据的数量
  9. }SL;
  10. // 动态顺序表
  11. typedef struct SeqList
  12. {
  13. SLDataType* arr;//动态的空间,创建指针变量
  14. int size; //有效数据的数量
  15. int capacity; //空间的大小容量
  16. }SL;

 1.2顺序表的初始化

void SLInit(SL* ps);
  1. // 顺序表的初始化
  2. void SLInit(SL* ps)
  3. {
  4. ps->arr = NULL; //将顺序表指针置为NULL
  5. ps->size = ps->capacity = 0;//将其他数据置为0
  6. }
  7. // 顺序表的销毁
  8. void SLDestroy(SL* ps)
  9. {
  10. if (ps->arr) //判断ps->arr是否为NULL,如果不为NULL,说明空间需要释放
  11. {
  12. free(ps->arr);
  13. }
  14. ps->arr = NULL;
  15. ps->size = ps->capacity = 0;
  16. }

 1.3顺序表的销毁

void SLDestroy(SL* ps);
  1. // 顺序表的销毁
  2. void SLDestroy(SL* ps)
  3. {
  4. if (ps->arr) //判断ps->arr是否为NULL,如果不为NULL,说明空间需要释放
  5. {
  6. free(ps->arr);
  7. }
  8. ps->arr = NULL;
  9. ps->size = ps->capacity = 0;
  10. }

 1.4顺序表的打印

void SLPrint(SL* ps);
  1. // 顺序表的打印
  2. void SLPrint(SL* ps)
  3. {
  4. for (int i = 0; i < ps->size; i++)
  5. {
  6. printf("%d ", ps->arr[i]);
  7. }
  8. printf("\n");
  9. }

 1.5顺序表的扩容

void SLCheckCapacity(SL* ps);
  1. // 顺序表的扩容
  2. void SLCheckCapacity(SL* ps)
  3. {
  4. // 判断容量是否够用
  5. if (ps->capacity == ps->size)
  6. {
  7. //执行扩容
  8. //检验原先的容量,如果有在原先容量*2,没有的话就先分配4。
  9. int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
  10. // 为了防止空间申请失败返回NULL,先用临时变量tmp接收
  11. SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));
  12. //申请失败提前返回
  13. if (tmp == NULL)
  14. {
  15. printf("perror realloc!");
  16. return;
  17. }
  18. //申请成功
  19. ps->arr = tmp;
  20. ps->capacity = newCapacity;
  21. }
  22. }

1.6顺序表的头插,尾插

 1.6.1头插

void SLPushFront(SL* ps, SLDataType x);
  1. //头插
  2. void SLPushFront(SL* ps, SLDataType x)
  3. {
  4. assert(ps);//断言防止传入空指针
  5. // 插入之前判断空间容量是否够
  6. SLCheckCapacity(ps);
  7. //进行头插
  8. for (int i = ps->size; i > 0; i--)
  9. {
  10. ps->arr[i] = ps->arr[i - 1];//ps->arr[1]=ps->arr[2]
  11. }
  12. ps->arr[0] = x;
  13. ps->size++;
  14. }

 

1.6.2尾插

void SLPushBack(SL* ps, SLDataType x);
  1. void SLPushBack(SL* ps, SLDataType x)
  2. {
  3. assert(ps);//断言防止传入空指针
  4. // 插入之前判断空间容量是否够
  5. SLCheckCapacity(ps);
  6. //进行尾插
  7. ps->arr[ps->size++] = x;
  8. }

 

 1.7顺序表的头删,尾删

 1.7.1头删

void SLPopFront(SL* ps);
  1. //头删
  2. void SLPopFront(SL* ps)
  3. {
  4. assert(ps);//断言防止传入空指针
  5. //防止顺序表没有数据可以删除
  6. assert(ps->size);
  7. //进行头删操作
  8. for (int i = 0; i < ps->size - 1; i++)
  9. {
  10. ps->arr[i] = ps->arr[i + 1];//ps->arr[size-2]=ps->arr[size-1]
  11. }
  12. ps->size--;
  13. }

 

1.7.2尾删

void SLPopBack(SL* ps);
  1. //尾删
  2. void SLPopBack(SL* ps)
  3. {
  4. assert(ps);//断言防止传入空指针
  5. //防止顺序表没有数据可以删除
  6. assert(ps->size);
  7. //进行尾删操作
  8. ps->size--;
  9. }

 

 1.8顺序表在指定位置之前插入,删除数据

 1.8.1 插入数据

void SLInsert(SL* ps, int pos, SLDataType x);
  1. //在指定位置之前插入数据
  2. void SLInsert(SL* ps, int pos, SLDataType x)
  3. {
  4. assert(ps);//断言防止传入空指针
  5. //判断插入的数据是否合法
  6. if (pos >= 0 && pos <= ps->size)
  7. {
  8. // 插入之前判断空间容量是否够
  9. SLCheckCapacity(ps);
  10. //插入数据
  11. for (int i = ps->size; i > pos; i--)
  12. {
  13. ps->arr[i] = ps->arr[i - 1];//ps->arr[pos+1]=ps->arr[pos];
  14. }
  15. ps->arr[pos] = x;
  16. ps->size++;
  17. }
  18. }

 

1.8.2 删除数据

void SLErase(SL* ps, int pos);
  1. //在指定位置之前删除数据
  2. void SLErase(SL* ps, int pos)
  3. {
  4. assert(ps);//断言防止传入空指针
  5. //判断删除的数据是否合法
  6. if (pos >= 0 && pos < ps->size)
  7. {
  8. // 删除数据
  9. for (int i = pos; i < ps->size - 1; i++)
  10. {
  11. ps->arr[i] = ps->arr[i + 1];//ps->[size-2]=ps->arr[size-1]
  12. }
  13. ps->size--;
  14. }
  15. }

 

 1.9顺序表数据的查找

int SLFind(SL* ps, SLDataType x); 
  1. // 1.9顺序表数据的查找
  2. int SLFind(SL* ps, SLDataType x)
  3. {
  4. assert(ps);//断言防止传入空指针
  5. //遍历顺序表
  6. for (int i = 0; i < ps->size; i++)
  7. {
  8. if (ps->arr[i] == x)
  9. {
  10. return i;//返回下标
  11. }
  12. }
  13. // 没有找到
  14. return -1;//返回一个不存在的下标
  15. }

 测试代码:

  1. #include "SeqList.h"
  2. void SLText01()
  3. {
  4. SL sl;
  5. //初始化
  6. SLInit(&sl);
  7. //打印
  8. //SLPrint(&sl);
  9. //增删查改
  10. //头插
  11. //SLPushFront(&sl, 1);
  12. //SLPushFront(&sl, 2);
  13. //SLPushFront(&sl, 3);
  14. //SLPushFront(&sl, 4);
  15. //SLPrint(&sl);// 4 3 2 1
  16. //头删
  17. /*SLPopFront(&sl);
  18. SLPopFront(&sl);
  19. SLPopFront(&sl);
  20. SLPrint(&sl);*/
  21. //尾插
  22. //SLPushBack(&sl, 1);
  23. //SLPushBack(&sl, 2);
  24. //SLPushBack(&sl, 3);
  25. //SLPushBack(&sl, 4);
  26. //SLPrint(&sl);// 1 2 3 4
  27. //尾删
  28. //SLPopBack(&sl);
  29. //SLPopBack(&sl);
  30. //SLPopBack(&sl);
  31. //SLPopBack(&sl);
  32. //SLPrint(&sl);
  33. 在指定位置之前插入数据
  34. //SLPushFront(&sl, 1);
  35. //SLPushFront(&sl, 2);
  36. //SLPushFront(&sl, 3);
  37. //SLPushFront(&sl, 4);
  38. //SLPrint(&sl);// 4 3 2 1
  39. //SLInsert(&sl, 4, 6);
  40. //SLPrint(&sl);// 4 3 2 6 1
  41. //在指定位置之前删除数据
  42. //SLPushFront(&sl, 1);
  43. //SLPushFront(&sl, 2);
  44. //SLPushFront(&sl, 3);
  45. //SLPushFront(&sl, 4);
  46. //SLPrint(&sl);// 4 3 2 1
  47. //SLErase(&sl, 2);
  48. //SLPrint(&sl);// 4 3 1
  49. // 1.9顺序表数据的查找
  50. //SLPushFront(&sl, 1);
  51. //SLPushFront(&sl, 2);
  52. //SLPushFront(&sl, 3);
  53. //SLPushFront(&sl, 4);
  54. //printf("顺序表中有:");
  55. //SLPrint(&sl);// 4 3 2 1
  56. //int find = SLFind(&sl, 6);
  57. //if (find > 0)
  58. //{
  59. // printf("找到了!下标是:%d\n", find);
  60. //}
  61. //else
  62. //{
  63. // printf("没有找到!\n");
  64. //}
  65. //销毁
  66. SLDestroy(&sl);
  67. }
  68. int main()
  69. {
  70. SLText01();
  71. return 0;
  72. }

 源代码文件:SeqList_2024_4_3 · 14c5b99 · 阳区欠/C语言学习路程 - Gitee.com

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

闽ICP备14008679号