当前位置:   article > 正文

数据结构:顺序表

数据结构:顺序表
数据结构是由“数据”和“结构”两词组合⽽来。
什么是数据?常⻅的数值1、2、3、4.....、教务系统⾥保存的⽤⼾信息(姓名、性别、年龄、学历等
等)、⽹⻚⾥⾁眼可以看到的信息(⽂字、图⽚、视频等等),这些都是数据
什么是结构?
当我们想要使⽤⼤量使⽤同⼀类型的数据时,通过⼿动定义⼤量的独⽴的变量对于程序来说,可读性 ⾮常差,我们可以借助数组这样的数据结构将⼤量的数据组织在⼀起,结构也可以理解为组织数据的⽅式。
想要找到草原上名叫“咩咩”的⽺很难,但是从⽺圈⾥找到1号⽺就很简单,⽺圈这样的结构有效将 ⽺群组织起来。

文章目录

  • 前言
  • 一、顺序表的分类
  • 二、动态顺序表的实现
    • 1.头文件Seqlist.h:顺序表结构,声明顺序表的方法
    • 2.Seqlist.c:实现顺序表的方法(增删查改)
  • 总结


前言

概念:数据结构是计算机存储、组织数据的⽅式。数据结构是指相互之间存在⼀种或多种特定关系
的数据元素的集合。数据结构反映数据的内部构成,即数据由那部分构成,以什么⽅式构成,以及数据元素之间呈现的结构。
总结:
1)能够存储数据(如顺序表、链表等结构)
2)存储的数据能够⽅便查找

一、顺序表的分类

1.顺序表与数组的区别

顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝

2.顺序表的分类 

2.1 静态顺序表

2.2 动态顺序表 

 

二、动态顺序表的实现

1.头文件Seqlist.h:顺序表结构,声明顺序表的方法

1.1定义
  1. #pragma once
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<assert.h>
  5. //定义顺序表的结构
  6. //#define N 100
  7. //
  8. 静态顺序表
  9. //struct SeqList
  10. //{
  11. // int arr[N];
  12. // int size;//有效数据个数
  13. //};
  14. typedef int SLDataType;
  15. //动态顺序表
  16. typedef struct SeqList
  17. {
  18. SLDataType* arr;
  19. int size; //有效数据个数
  20. int capacity; //空间大小
  21. }SL;
  22. //typedef struct SeqList SL;

 对数组的类型进行重命名,方便后期修改

1.2 声明方法 
  1. //顺序表初始化
  2. void SLInit(SL* ps);
  3. //顺序表的销毁
  4. void SLDestroy(SL* ps);
  5. void SLPrint(SL s);
  6. //头部插入删除 / 尾部插入删除
  7. void SLPushBack(SL* ps, SLDataType x);
  8. void SLPushFront(SL* ps, SLDataType x);
  9. void SLPopBack(SL* ps);
  10. void SLPopFront(SL* ps);
  11. //指定位置之前插入/删除数据
  12. void SLInsert(SL* ps, int pos, SLDataType x);
  13. void SLErase(SL* ps, int pos);
  14. int SLFind(SL* ps, SLDataType x);

2.Seqlist.c:实现顺序表的方法(增删查改)

2.1 初始化

注:包含头文件

  1. #include"SeqList.h"
  2. void SLInit(SL* ps)
  3. {
  4. ps->arr = NULL;
  5. ps->size = ps->capacity = 0;
  6. }
 2.2 销毁
  1. //顺序表的销毁
  2. void SLDestroy(SL* ps)
  3. {
  4. if (ps->arr) //等价于 if(ps->arr != NULL)
  5. {
  6. free(ps->arr);
  7. }
  8. ps->arr = NULL;
  9. ps->size = ps->capacity = 0;
  10. }

此处参数传地址 

 2.3 判断空间大小,申请空间

申请多大的空间?事实上都是成倍增加,一般是二倍或者三倍,有数学(概率论)推导而来

  1. void SLCheckCapacity(SL* ps)
  2. {
  3. //插入数据之前先看空间够不够
  4. if (ps->capacity == ps->size)
  5. {
  6. //申请空间
  7. //malloc calloc realloc int arr[100] --->增容realloc
  8. //三目表达式
  9. int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
  10. SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));//要申请多大的空间
  11. if (tmp == NULL)
  12. {
  13. perror("realloc fail!");
  14. exit(1);//直接退出程序,不再继续执行
  15. }
  16. //空间申请成功
  17. ps->arr = tmp;
  18. ps->capacity = newCapacity;
  19. }
  20. }
2.4 尾插
  1. //头插
  2. void SLPushFront(SL* ps, SLDataType x)
  3. {
  4. assert(ps);
  5. SLCheckCapacity(ps);
  6. //先让顺序表中已有的数据整体往后挪动一位
  7. for (int i = ps->size; i > 0; i--)
  8. {
  9. ps->arr[i] = ps->arr[i - 1];//arr[1] = arr[0]
  10. }
  11. ps->arr[0] = x;
  12. ps->size++;
  13. }
2.5 头插
  1. //头插
  2. void SLPushFront(SL* ps, SLDataType x)
  3. {
  4. assert(ps);
  5. SLCheckCapacity(ps);
  6. //先让顺序表中已有的数据整体往后挪动一位
  7. for (int i = ps->size; i > 0; i--)
  8. {
  9. ps->arr[i] = ps->arr[i - 1];//arr[1] = arr[0]
  10. }
  11. ps->arr[0] = x;
  12. ps->size++;
  13. }
2.6 尾删
  1. void SLPopBack(SL* ps)
  2. {
  3. assert(ps);
  4. assert(ps->size);
  5. //顺序表不为空
  6. //ps->arr[ps->size - 1] = -1;
  7. --ps->size;
  8. }
2.7头删
  1. void SLPopFront(SL* ps)
  2. {
  3. assert(ps);
  4. assert(ps->size);
  5. //数据整体往前挪动一位
  6. for (int i = 0; i < ps->size-1 ; i++)
  7. {
  8. ps->arr[i] = ps->arr[i + 1]; //arr[size-2] = arr[size-1]
  9. }
  10. ps->size--;
  11. }

注意循环条件,小心越界 

总结

  1. 顺序存储:顺序表使用一块连续的存储空间来存储元素,可以方便地进行插入、删除和查找操作。

  2. 快速访问:由于元素在内存中是连续存储的,所以可以通过下标来快速访问表中的元素,时间复杂度为O(1)。

  3. 动态扩容:顺序表可以根据需要动态扩容,可以在插入元素时动态分配内存空间,不需要预先指定容量。

  4. 空间效率高:相对于链表等其他数据结构,顺序表的存储空间利用率更高,不需要额外的指针存储关系。

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

闽ICP备14008679号