当前位置:   article > 正文

【数据结构】顺序表的实现(C语言)

【数据结构】顺序表的实现(C语言)

数据结构中的顺序表是一种线性表,它使用一段连续的物理空间来存储数据。顺序表中的元素在逻辑上相邻,在物理存储空间中也相邻。顺序表的存储结构具有随机存取的特性,可以支持快速的随机访问,但插入和删除操作需要移动大量元素,效率较低。顺序表通常适用于静态数据集合或对数据访问速度有较高要求的场景。
 

1.顺序表的结构体定义

#define N 100
typedef struct
{
int a [ N ]; // 存数据的数组 -- 数据域
int last ; // 时刻代表顺序表中有效元素的个数
} seqlist_t ;
顺序表的操作:
//1. 创建一个空的顺序表 createEmpty()
//2. 判断一个顺序表是否为空 空的话返回 1 不空返回 0 isEmpty()
//3. 判断一个顺序表是否为满 空的话返回 1 不空返回 0 isFull()
//4. 遍历顺序表中所有有效元素 showSeqlist()
//5. 在指定位置插入数据 insertInto()
//6. 删除指定位置上数据 deleteFrom()
//7. 求顺序表的长度 getLength()
//8. 查找某个元素出现在顺序表中的位置 findData()
//9. 清空顺序表 clearSeqlist()

2.创建一个空的顺序表

  1. //1.创建一个空的顺序表
  2. seqlist_t* createEmptySeqlist()
  3. {
  4. seqlist_t* p = malloc(sizeof(seqlist_t));
  5. if(p == NULL)
  6. {
  7. printf("malloc failed!!\n");
  8. return NULL;
  9. }
  10. p->last = 0;//因为是空的顺序表,有效元素个数初始化为0
  11. return p;//将malloc申请空间的首地址返回
  12. }

3.判断顺序表是否为满

  1. 判断顺序表是否为满 表满返回值是1,未满是0
  2. 当顺序表中有效元素的个数与定义数组最大长度相等即为满表
  3. //2. 判断顺序表是否为满 表满返回值是1,未满是0
  4. int isFullSeqlist(seqlist_t* p)
  5. {
  6. if(p->last == N)//有效元素个数 == 数组的长度,说明表满
  7. return 1;
  8. else
  9. return 0;
  10. }

4.指定位置插入数据操作

编程思想 :
1. 找到需要整体向后移动的有效元素的下标范围 post - 1 --- last - 1
2. 整体向后移动一个位置
3. 在插入位置,放上插入元素
4. 有效元素个数 + 1
  1. int insertIntoSeqlist(seqlist_t* p, int post, int x)
  2. {
  3. //0. 容错判断
  4. if(post <= 0 || post > p->last+1 || isFullSeqlist(p))
  5. {
  6. printf("insertIntoSeqlist failed!!\n");
  7. return -1;//通常用-1来表达失败
  8. }
  9. //1. 将从插入位置的元素下标到最后一个有效元素整体向后移动一个位置
  10. //post-1 ----- p->last-1
  11. int i;
  12. for(i = p->last-1; i >= post-1; i--)
  13. p->data[i+1] = p->data[i];
  14. //2.在插入位置,放上插入的数据x
  15. p->data[post-1] = x; //post-1得到插入位置的下标
  16. //3.有效元素个数+1
  17. p->last++;
  18. return 0;//代表插入成功
  19. }

5.展示顺序表中有效元素

  1. //4. 遍历顺序表将所有有效元素展示
  2. void showSeqlist(seqlist_t* p)
  3. {
  4. int i;
  5. for(i = 0; i < p->last; i++)
  6. {
  7. printf("%d ", p->data[i]);
  8. }
  9. printf("\n");
  10. }

6.判断顺序表是否为空

  1. //顺序表中有效元素是0个即为空的顺序表
  2. int isEmptySeqlist(seqlist_t* p)
  3. {
  4. return p->last == 0;//判断有效元素个数是否 == 0
  5. }

7.指定位置删除数据

编程思想 :
1. 找到需要整体向前移动的有效元素的下标范围 post --- last - 1
2. 整体向前移动一个位置
3. 有效元素个数 - 1
  1. int deleteFromSeqilst(seqlist_t* p, int post)
  2. {
  3. //0.容错判断
  4. if(post <= 0 || post > p->last || isEmptySeqlist(p))
  5. {
  6. printf("deleteFromSeqilst failed!!\n");
  7. return -1;
  8. }
  9. //1.将从删除位置的后一个位置的下标到最后一个有效元素,整体向前移动一个位置
  10. //post ---- p->last-1
  11. int i;
  12. for(i = post; i <= p->last-1; i++)
  13. p->a[i-1] = p->a[i];
  14. //2.有效元素个数-1
  15. p->last--;
  16. return 0;//删除成功
  17. }

8.查找指定数据

  1. //查找指定的数据x 在顺序表中的位置
  2. 遍历整个顺序表的所有有效元素 逐个比较 只要与查找的元素值相等返回下标即可(第一次出现)
  3. 不存在返回-1
  4. int searchDataSeqlist(seqlist_t* p, int x)
  5. {
  6. int i;
  7. //遍历有效元素查找
  8. for(i = 0; i < p->last; i++)
  9. {
  10. if(p->data[i] == x)
  11. return i;//返回值代表的是,元素在数组中的下标
  12. }
  13. //如果程序能走到这,说明不存在
  14. return -1;
  15. }

9.求顺序表的长度

  1. //有效元素个数就是顺序表的长度
  2. int getLengthSeqlist(seqlist_t* p)
  3. {
  4. return p->last;
  5. }

10.清空顺序表

  1. //有效元素个数赋值为0即为空表
  2. void clearSeqlist(seqlist_t* p)
  3. {
  4. p->last = 0;
  5. }

(顺序表清空不是清空数组元素,而是把有效元素个数last置为0)

结语

以上就是顺序表的实现方法,本次代码分享到此结束。后续还会分享数据结构有关知识。

最后的最后,还请大家点点赞,点点关注,谢谢!

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

闽ICP备14008679号