当前位置:   article > 正文

带你认识顺序表——基本的数据结构

带你认识顺序表——基本的数据结构

       顺序表是一种基本的数据结构,它在程序设计和算法实现中扮演着重要的角色。顺序表的概念源于数学中的向量或数组,是一种线性表数据结构,其元素按照线性顺序排列,并通过一组连续的存储单元来存储数据。本文介绍了顺序表的分类以及对动态顺序表的实现,希望大家能够有所收获。

目录

1.顺序表的概念及结构

1.1线性表

1.2顺序表的分类

静态顺序表

动态顺序表

2.动态顺序表的实现

2.1创建结构体

2.2初始化

2.3检查空间是否满了并开辟空间

2.4打印顺序表

2.5在最前面插入一个数据

2.5删除最前面的一个数据

2.6在尾部插入一个数据

2.7删除尾部的一个数据

2.8指定位置前插入一个数据

2.9指定位置删除一个数据

2.10销毁


1.顺序表的概念及结构

1.1线性表

        线性表是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串... 所以顺序表是线性表的一种。
        线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

1.2顺序表的分类

静态顺序表

使⽤定⻓数组存储元素

 静态顺序表缺陷:空间给少了不够⽤,给多了造成空间浪费

动态顺序表

2.动态顺序表的实现

2.1创建结构体

  1. typedef int SLDateType;
  2. typedef struct SeqList
  3. {
  4. SLDateType* arr;
  5. int size;
  6. int capacity;
  7. }SL;

2.2初始化

  1. void SLinit(SL* ps)
  2. {
  3. ps->arr = NULL;
  4. ps->size = 0;
  5. ps->capacity = 0;
  6. }

2.3检查空间是否满了并开辟空间

  1. void SLcheck(SL* ps)
  2. {
  3. //如果内容存满了
  4. if (ps->size == ps->capacity)
  5. {
  6. //如果空间为0
  7. if (ps->capacity == 0)
  8. {
  9. ps->capacity = 4;
  10. }
  11. //realloc申请空间给tmp
  12. SLDateType* tmp = (SLDateType*)realloc(ps->arr, ps->capacity * sizeof(SLDateType));
  13. //申请失败
  14. if (tmp == NULL)
  15. {
  16. perror("realloc fail!");
  17. exit(1);
  18. }
  19. //申请成功 tmp指向arr
  20. ps->arr = tmp;
  21. }
  22. }

2.4打印顺序表

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

2.5在最前面插入一个数据

  1. void SLpushfront(SL* ps, SLDateType x)
  2. {
  3. //检查空间是否足够
  4. SLcheck(ps);
  5. //从后向前把每一位往后挪一位
  6. for (int i = ps->size; i > 0; i--)
  7. {
  8. ps->arr[i] = ps->arr[i-1];
  9. }
  10. //插入x
  11. ps->arr[0] = x;
  12. ps->size++;
  13. }

2.5删除最前面的一个数据

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

2.6在尾部插入一个数据

  1. void SLpushback(SL* ps, SLDateType x)
  2. {
  3. //检查空间是否足够
  4. SLcheck(ps);
  5. //直接在最后插入
  6. ps->arr[ps->size] = x;
  7. ps->size++;
  8. }

2.7删除尾部的一个数据

  1. void SLpopbake(SL* ps)
  2. {
  3. ps->arr[ps->size-1] = 0;
  4. ps->size--;
  5. }

2.8指定位置前插入一个数据

  1. void SLinsert(SL* ps, int pos, SLDateType x)
  2. {
  3. //检查空间是否足够
  4. SLcheck(ps);
  5. //从后向前 把每一位向后挪一位 直到指定位置停下
  6. for (int i = ps->size; i>pos; i--)
  7. {
  8. ps->arr[i] = ps->arr[i - 1];
  9. }
  10. ps->arr[pos] = x;
  11. ps->size++;
  12. }

2.9指定位置删除一个数据

  1. void SLerase(SL* ps, int pos)
  2. {
  3. for (int i = pos; i<ps->size; i++)
  4. {
  5. ps->arr[i] = ps->arr[i + 1];
  6. }
  7. ps->arr[ps->size] = 0;
  8. ps->size--;
  9. }

2.10销毁

  1. void SLdestory(SL* ps)
  2. {
  3. if (ps->arr != NULL)
  4. {
  5. free(ps->arr);
  6. }
  7. ps->arr = NULL;
  8. ps->size = ps->capacity = 0;
  9. }

       顺序表作为一种基本的数据结构,在C语言编程中具有重要的地位。它简单、高效,适用于许多场景,但同时也存在一些局限性。了解顺序表的原理和特点,能够帮助我们更好地设计程序和实现算法。在实际应用中,我们需要根据具体需求,合理选择和使用顺序表,以发挥其最大的优势。

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

闽ICP备14008679号