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_Sqi<=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++;
}