目录
顺序表的定义
顺序表指定是用一组地址连续的存储单元依次存储线性表的存储单元
其实顺序表就是利用 数组 实现的 如下图
顺序表的特点
在逻辑结构上是相邻的数据元素
在物理位置上也是相邻的
顺序表的实现
创建一个顺序表结构体
#define maxsize 100 typedef struct{ Elemtype *elem;//Elemtype 可以是任意数据类型 int length;//表的长度 }sqlist;//顺序表结构类型为sqlist
初始化一个顺序表
初始化一个顺序表无非是申请一块地址 并将数组长度设置为0
struct InitList(sqlist &L) { L.elem=new ElemType[maxsize];//申请一个大小为maxsize的数组空间 if(!L.elem) exit(OVERFLOW);//申请失败直接退出 L.length=0;//表的长度为0 return 1; }
这样顺序表的创建就完成了 接下来就是 增 删 查
顺序表操作
增
增加操作就是将元素增加到数组中(将数组中插入位置后的数向后移动空出来一个空后插入元素与数组插入元素相同)
int ListInsert(SqList &L,int i,ElemType e) { //表是L i代表插入位置 e为插入的数 if((i<1)||(i>L.length+1)) return 0;//检查插入位置是否合法 if(L.length == maxsize) return 0;//检查数组是否还有空 for(int j=L.length-1;j>=i-1;j--){//下标是从0开始的 L.elem[j+1]=L.elem[j]; } L.elem[j-1]=e; ++L.length;//插入一个元素要记得长度+1 return 1; }
时间复杂度: O(n)
删
删除操作就是将元素添加到数组中(将数组中需要删除元素后的元素向前移动直接覆盖便可以 与数组删除元素相同)
int ListDelete(SqList &L,int i){ //i 代表要删除的位置 if((i<1)|| (i>L.length)) return 0;//判断i位置是否合法 for(int j=i;j<L.length;j++) L.elem[j-1]=L.elem[j] --L.length;//数组长度-1 return 1; }
时间复杂度:O(n)
查
按照元素值查找位置 和数组操作相同
int LocateElem(SqList L, ElemType e){ for(int i=0;i<L.length;i++) if(L.elem[i]==e) return i+1;查找成功返回序号(从1开始) return 0;//查找失败 }
时间复杂度 :O(n)
顺序表的优缺点
优点 :
1.存储密度大
2.可以随机存储(直接存储)
缺点:
1.在插入操作时复杂
2.浪费空间 需要连续的空间
3.使用数组长度固定不能自动扩容