当前位置:   article > 正文

【数据结构】超详细之顺序表(利用C语言实现)_(1)设计顺序表并由输入数据建立顺序表、输出顺序表数据、利用原空间和一个额外存

(1)设计顺序表并由输入数据建立顺序表、输出顺序表数据、利用原空间和一个额外存

文章目录


前言

数据结构是一个程序员必须会的一种操作功能,学习数据结构能提高我们的逻辑思维能力以及解决实际项目能力,数据结构分为很多种,今天我们要讲的是数据结构中的顺序表.

一、顺序表是什么?

1.顺序表其本质是一种类似于数组的空间,其存储方式与数组一样,具有一段连续的空间.

2.顺序表的功能大致为实现增删改查操作,像QQ群或者微信群中存放的群员列表,都可以用顺序表实现.

3.在实际应用中,顺序表能大大提高工作效率,是一种结构化、具体化的工具

二、使用步骤

1.顺序表的初始化以及开辟空间

代码如下(示例):
 

  1. //.h文件内
  2. #pragma once
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5. #include<assert.h>
  6. typedef int TYPE;//将类型重命名作为存放数据的类型,使程序灵活改变
  7. //定义一个结构体类型,用于存放数据
  8. typedef struct  SequenceList
  9. {
  10.     TYPE* Data;//数据
  11.     int sz;//计算有效数据
  12.     int sum;//计算空间容量
  13. }SL;
  14. //初始化顺序表
  15. void SeqListInit(SL* ps);
  1. //.c文件内
  2. #define _CRT_SECURE_NO_WARNINGS 1
  3. #include"SequenceList.h"
  4. //初始化顺序表
  5. void SeqListInit(SL* ps)
  6. {
  7. assert(ps);
  8. ps->Data = (TYPE*)malloc(sizeof(TYPE)*4);//开辟四个空间
  9. if (ps->Data == NULL)
  10. {
  11. perror("malloc");
  12. return;
  13. }
  14. ps->sum = 4;
  15. ps->sz = 0;
  16. }

2.实现顺序表的头插、尾插以及打印

代码如下(示例):

  1. .h文件
  2. //顺序表头部插入(头插)
  3. void SeqListPushFront(SL* ps, TYPE x);
  4. //顺序表尾部插入(尾插)
  5. void SeqListPushBack(SL* ps, TYPE x);
  6. //打印数据
  7. void SeqListPrint(SL* ps);
  1. .c文件
  2. //扩容
  3. void SLCheckCapacity(SL* ps)
  4. {
  5. assert(ps);
  6. if (ps->sum == ps->sz)
  7. {
  8. TYPE* Add = (TYPE*)realloc(ps->Data, sizeof(TYPE) * 8);//默认一次扩增加4空间
  9. if (Add == NULL)
  10. {
  11. perror("realloc");
  12. return;
  13. }
  14. ps->Data = Add;
  15. ps->sum += 4;
  16. }
  17. }
  18. //顺序表头部插入(头插)
  19. void SeqListPushFront(SL* ps, TYPE x)
  20. {
  21. assert(ps);
  22. //判断是否还有容量,是否需要扩容
  23. SLCheckCapacity(ps);
  24. int n = ps->sz;
  25. while (n>0)
  26. {
  27. ps->Data[n] = ps->Data[n - 1];
  28. n--;
  29. }
  30. ps->Data[0] = x;
  31. ps->sum--;
  32. ps->sz++;
  33. }
  34. //顺序表尾部插入(尾插)
  35. void SeqListPushBack(SL* ps, TYPE x)
  36. {
  37. assert(ps);
  38. //判断是否还有容量,是否需要扩容
  39. SLCheckCapacity(ps);
  40. ps->Data[ps->sz] = x;
  41. ps->sum--;
  42. ps->sz++;
  43. }
  44. //打印数据
  45. void SeqListPrint(SL* ps)
  46. {
  47. assert(ps);
  48. int i = 0;
  49. for (i = 0; i < ps->sz; i++)
  50. {
  51. printf("%d->", ps->Data[i]);
  52. }
  53. }
  1. //.c文件(启动文件)
  2. #define _CRT_SECURE_NO_WARNINGS 1
  3. #include"SequenceList.h"
  4. int main()
  5. {
  6. SL pr;
  7. SeqListInit(&pr); //初始化
  8. SeqListPushBack(&pr, 1);//尾插
  9. SeqListPushFront(&pr, 2);//头插
  10. SeqListPushBack(&pr, 3);//尾插
  11. SeqListPrint(&pr);//打印
  12. return 0;
  13. }

3.实现顺序表的头删、尾删以及打印

代码如下(示例):

  1. .h文件
  2. //顺序表头部删除(头删)
  3. void SeqListPopFront(SL* ps);
  4. //顺序表尾部删除(尾删)
  5. void SeqListPopBack(SL* ps);
  1. .c文件
  2. //顺序表头部删除(头删)
  3. void SeqListPopFront(SL* ps)
  4. {
  5. assert(ps);
  6. if (ps->sz == 0)
  7. {
  8. return;
  9. }
  10. int n = 0;
  11. while (n<(ps->sz)-1)
  12. {
  13. ps->Data[n] = ps->Data[n + 1];
  14. n++;
  15. }
  16. ps->sum++;
  17. ps->sz--;
  18. }
  19. //顺序表尾部删除(尾删)
  20. void SeqListPopBack(SL* ps)
  21. {
  22. assert(ps);
  23. if (ps->sz == 0)
  24. {
  25. return;
  26. }
  27. ps->sz--;
  28. }


4.实现顺序表的查找

代码如下(示例):

  1. .h文件
  2. //顺序表的查找
  3. //找到了返回该数下标
  4. //没找到返回-1;
  5. int SeqListFind(SL* ps, TYPE x);
  1. .c文件
  2. //顺序表的查找
  3. //找到了返回该数下标
  4. //没找到返回-1;
  5. int SeqListFind(SL* ps, TYPE x)
  6. {
  7. assert(ps);
  8. assert(ps->sz);
  9. int i = 0;
  10. for (i = 0; i < ps->sz; i++)
  11. {
  12. if (ps->Data[i] == x)
  13. {
  14. return i;
  15. }
  16. }
  17. return -1;
  18. }


5.实现顺序表指定位置插入

代码如下(示例):

  1. .h文件
  2. //顺序表指定插入
  3. void SeqListInsert(SL* ps, int pos, TYPE x);
  1. .c文件
  2. //顺序表指定插入
  3. void SeqListInsert(SL* ps, int pos, TYPE x)
  4. {
  5. assert(ps);
  6. //判断是否还有容量,是否需要扩容
  7. SLCheckCapacity(ps);
  8. assert(pos >= 0 && pos <= ps->sz);
  9. int n = ps->sz;
  10. while (n>pos)
  11. {
  12. ps->Data[n] = ps->Data[n - 1];
  13. n--;
  14. }
  15. ps->Data[pos] = x;
  16. ps->sz++;
  17. ps->sum--;
  18. }

当有指定位置插入功能时,头插和尾插就可以简化成如下代码:

  1. //顺序表头部插入(头插)
  2. void SeqListPushFront(SL* ps, TYPE x)
  3. {
  4. assert(ps);
  5. //判断是否还有容量,是否需要扩容
  6. SLCheckCapacity(ps);
  7. SeqListInsert(ps, 0, x);
  8. }
  9. //顺序表尾部插入(尾插)
  10. void SeqListPushBack(SL* ps, TYPE x)
  11. {
  12. assert(ps);
  13. //判断是否还有容量,是否需要扩容
  14. SLCheckCapacity(ps);
  15. SeqListInsert(ps, ps->sz, x);
  16. }

6.实现顺序表指定位置删除

代码如下(示例):

  1. .h文件
  2. //顺序表指定删除
  3. void SeqListErase(SL* ps, int pos);
  1. .c文件
  2. //顺序表指定删除(根据下标进行删除)
  3. void SeqListErase(SL* ps, int pos)
  4. {
  5. assert(ps);
  6. assert(pos >= 0 && pos<=ps->sz);
  7. assert(ps->sz);
  8. int n = pos + 1;
  9. while(n<ps->sz)
  10. {
  11. ps->Data[n-1] = ps->Data[n];
  12. n++;
  13. pos++;
  14. }
  15. ps->sz--;
  16. ps->sum++;
  17. }


7.释放内存

代码如下(示例):

  1. .h文件
  2. //释放空间
  3. void SeqListDestroy(SL* ps);

  1. .c文件
  2. //释放空间
  3. void SeqListDestroy(SL* ps)
  4. {
  5. assert(ps);
  6. free(ps->Data);
  7. ps->Data = NULL;
  8. ps->sum = 0;
  9. ps->sz = 0;
  10. }

总结

以上就是我对数据结构——顺序表的理解,谢谢大家观看!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号