1.什么是顺序表
用一组地址连续的存储单元依次存储线性表的数据元素,称这种存储结构的线性表为顺序表。
2.定义顺序表
在实际应用中,可以根据实际需求定义表中元素的数据类型,如int、float、char、struct等类型。注意区分元素位置序号(从1开始)和该元素在数组中的下标位置(从0开始)对应的关系,如a1对应数组elem[0]。
#define MAXSIZE 100//顺序表可能达到的最大长度
typedef struct
{
ElemType *elem;//存储空间的基地址
int length;//当前长度
}Sqlist;//顺序表的结果类型为Sqlist
3.顺序表中基本操作的实现
1>.初始化
C++版
Status Initlist(Sqlist &L)
{
L.elem=new ElemType[MAXSIZE];//分配大小为MAXSIZE的数组空间
if(!L.elem)
exit(OVERFLOW);//存储分配失败退出
L.length=0;//将表的当前长度设位0
return ok;
}
C语言版
L.elem=(ElemType *)malloc(MAXSIZE*sizeof(ElemType)
if(L.elem=NULL)
exit(OVERFLOW);
2>.取值
注意i的值 1<=i<=L.length
Status Getelem(Sqlist L,int i,ElemType &e)
{
if(i<1||i>L.length)
return ERROR;//判断i的值是否合理
e=L.elem[i-1];//elem[i-1]单元存储第i个数据元素
return ok;
}
时间复杂度为O(1)
3>.查找
int LocateElem(Sqlist L,ElemType e)
{
for(i=0;i<L.length;i++)
if(L.elem[i]==e)
return i+1;//查找成功返回i+1
rerurn 0;//查找失败返回0
}
时间复杂度为O(n)
4>.插入
注意需要考虑表长是否达到预设的最大空间。注意此时i的合法范围是1<=i<=L.length+1
Status ListInsert(Sqlist &L,int i,ElemType e)
{
if((i<i)||(i>L.length+1))//i的值不合法
return ERROR;
if(L.length==MAXSIZE)//空间已满
return ERROR;
for(j=L,length-1;j>=i-1;j--)
L.elem[j+1]=L.elem[j];//将第n个至第i个位置的元素依次后移一位
L.elem[i-1]=e;//空出第i个位置,将要插入的元素e放入第i个位置
++L.length;//表的长度加1
return ok;
}
比如我们现在要第4个位置上插入数字8,则需要第4个至第6个数据元素依次后移一位
插入前线性表n=6
5 | 6 | 7 | 9 | 10 | 11 |
插入之后线性表为n=7
5 | 6 | 7 | 8 | 9 | 10 | 11 |
时间复杂度为O(n)
5>.删除
注意此时i的合法范围是1<=i<=L.length
Status ListDelete(Sqlist &L,int i)
{
if((i<i)||(i>L.length))//i的值不合法
return ERROR;
for(j=i;j<=L.length;j++)
L.elem[j-1]=L.elem[j];//被删除元素之后的元素前移
--L.length;//表的长度减1
return ok;
}
比如我们现在要删出第3个数据元素数字7,则需要第4个至第6个数据元素依次前移一位
插入前线性表n=6
删除前 n=6
5 | 6 | 7 | 9 | 10 | 11 |
删除后 n=5
5 | 6 | 9 | 10 | 11 |
时间复杂度为O(n)
总结
不断学习,把学习当老公!xp加油!!制作不易,喜欢的就留下痕迹吧!如有错误欢迎大家在评论区积极指出。