2.2线性表的顺序表

2.2.1线性表的顺序表示和实现------顺序映像

【顺序存储】在【查找时】的时间复杂度为【O(1)】,因为它的地址是连续的,只要知道首元素的地址,根据下标可以很快找到指定位置的元素
【插入和删除】操作由于可能要在插入前或删除后对元素进行移动,所以顺序存储的时间复杂度为【O(n)】。

1)初始化操作
思想:构造一个空表
设置表起始位置、表长及可用空间

#define LIST_INIT_SIZE 100
#define LISTINCREAMENT 10
typedef struct
{
ElemType *elem;   //定义个地址变量,使其后面能指向线性表占用的数组空间
int length;  // 线性表的长度
int listsize;  // 当前分配的存储容量
}SqList;

//初始化操作
Status InitList_Sq(SqList &L)  //初始化
{ //构造一个空表
L.elem=(ElemType)malloc(LIST_INIT_SIZE*size of(ElemType));
if(!L.elem)  exit(OVERFLOW);  //存储分配失败
L.length=0;   //空表长度为0
L.listsize=LIST_INIT_SIZE;  //初始存储容量
return OK;

}

2.2.3顺序表的插入

2)顺序插入操作

目的:在线性表L第i个元素前插入一个元素e

【基本思想
1)判断i是否在允许范围
2)存储空间是否已满
3)将第i个元素和后面的所有元素向后移动
4)新元素写在空出的第i个位置
5)线性表长度加1

【注意】
长度为n的顺序表第i个位置插入移动n-i+1个元素


Status ListInsert_Sq(SqList&L,int i,ElemType e){

if(i<1||i>1.lenth+1)
return ERROR;   //插入位置不合法

if(L.length>=L.listsize)
{}     //判断空间足够

q=&(L.elem[i-1]);   //q指向插入位置

for(p=&(L.elem[L.elem-1]);p>-q;--q)
*(p+1)=*p;
*q=e;
++L.length;
return OK;
}

2.2.4顺序表的删除和插入

【基本思路
1)判断i是否在允许范围
2)将线性表的第i个元素给e
3)将第i个元素和后面的所有元素向前移动一个位置
4)线性表长度减1


Status ListDelete_Sq(SqList&L,int i,ElemType e){

//删除第i个元素并用e返回值

if(i<1||i>1.lenth+1)
return ERROR;   //删除位置不合法

p=&(L.elem[i-1]);   //q指向插入位置
e=*p;
q=L.elem+L.length-1; //表尾元素位置
for(++p;p<=q;++p)
*(p-1)=*p;    //p-1指向p

--L.length;
return OK;
}

【图】:平均移动次数

【查找操作】11:42

int LocateElem_Sq(SqList,ElseType e)
{
//查询第一个 满足条件的元素,若存在,返回位序,否则返回0;
int i;
i=1;
while (i<=L.length&&L.elem[i-1]!=e)
++i;
if(i<=L.length)
return i;
else return 0;
}// locateElem_Sq


i<=L.length&&L.elem[i-1]!=e
i>L.length

【顺序结构优缺点14:15
【优点:
逻辑相邻,物理相邻
可随机存取一元素
存储空间使用紧凑
【缺点:
插入,删除需要移动大量元素
预先分配空间需按最大空间分配,利用不充分表难以扩充

【】线性表的合并问题
【图:例1】
基本思路:
1)初始化Lc为空表
2)分别从La和Lb取得当前元素ai和bi
3)若ai<bj,则将ai插入到Lc中,否则
bj插入到Lc中

代码:


Viod MergeList(SqList La,SqList lb,SqList &Lc)
{
Pa=La,elem;
Pb=Lb.elem;
Lc.listsize=Lc.length=La,elem+Lb.elem;
Pc=Lc.elem=(ElemType*)malloc(Lc.listsize*sizeof(ElemType));
if(!Lc.elem)
exit(overflow);
Pa_last=La.elem+La.length-1;
Pb_last=Lb.elem+Lb.length-1;
while(pa<=pa_last&&pb<=pb_last)
{
if(*pa<=*pb)
*pc++=*pa++;
else
*pa++=*pb++;
}
while(pa<=pa_last)
*pa++=*pa++;
while (pb<=pb_last)
*pc++=*pb++;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

b1gpig安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值