顺序表相关算法

顺序表的类型定义
#define MAXSIZE 100∥最大长度
typedef struct{
	ElemType	*elem;//指向数据元l素的基地址
    int length;//线性表的当前实际长度
    int listsize;//线性表的预分配长度
 }SqList;
初始化线性表L(参数用指针)
Status InitList_Sq(SqList*L){ //构造一个空的顺序表L
L->elem= (ElemType*) malloc(MAXSIZE*sizeof(ElemType)); 
    //为顺序表分配空间
if(! L-> elem) exit(OVERFLOW); //存储分配失败
L-> length=0;//空表长度为0
return OK;}
销毁和清空线性表
void DestoryList(SqList *L)
{	//释放存储空间
	if(!L->elem)  free(L->elem);
}
void ClearList(SqList *L)
{	//将线性表长度置为0
	L->length=0;
}
求线性表L长度和判断线性表L是否为空
int GetLength(SqList*L)
{ return (L->length);}
int IsEmpty(SqList*L)
{	if (L->length==0) return 1;
	else return 0;}
线性表取值(根据位置i获取相应内容)
int GetElem(SqList*L,int i,ElemType *e)
{	if(i<1||i>L->length)return ERROR;
   //判断i值是否合理,若不合理,返回ERROR
  *e=L->elem[i-1];//第i-1的单元存储着第i个数据
  return OK;}//随机存取
线性表查找(根据数据获取所在位置)
int LocateElem_Sq(SqList*L, ElemTypee) 
{ int i;
for ( i= 0; i< L->length; i++)
{if (L->elem[i].price == e.price)
	return i+ 1;//查找成功,返回序号i+1}
return 0;}//查找失败,返回0
线性表插入(数据e插在第i个结点之前,移动n-i+1次)
1)判断插入位置i是否合法。i<=L->length?2)判断顺序表的存储空间是否已满。L->length>MAXSIZE?3)将第n至第i位的元素依次向后移动一个位置,空出第i个位置。
(4)将要插入的新元素e放入第i个位置。
(5)表长加1,插入成功返回OK。
Status ListInsert_Sq(SqList*L,int i,ElemType e){
if(i<1 || i>L->length+1) return ERROR;//i值不合法
if(L->length==MAXSIZE) return ERROR; 
//当前存储空间已满
for(j=L->length-1;j>=i-1;j--) 
 //j从0开始,最大下标为L->length-1
L->elem[j+1]=L->elem[j]; //插入位置及之后的元素后移
L->elem[i-1]=e; //将新元素e放入第i个位置
++L->length;//表长增1
return OK;}

【分析】算法时间耗费在移动元素操作上。
若插入在尾结点之后,则根本无需移动(特别快);
若插入在首结点之前,则表中元素全部后移(特别慢);
若要考虑在各种位置插入(共n+1种可能)的平均移动次数,
f avgrage ( n ) = 1 n + 1 ∑ i = 1 n + 1 ( n − i + 1 ) = 1 n + 1 ( n + ⋯ + 1 + 0 ) = 1 ( n + 1 ) n ( n + 1 ) 2 = n 2 \begin{array}{l}{f_{\text {avgrage}}(n)=\frac{1}{n+1} \sum_{i=1}^{n+1}(n-i+1)=\frac{1}{n+1}(n+\cdots+1+0)} \\ {=\frac{1}{(n+1)} \frac{n(n+1)}{2}=\frac{n}{2}}\end{array} favgrage(n)=n+11i=1n+1(ni+1)=n+11(n++1+0)=(n+1)12n(n+1)=2n

线性表删除(删除第i个结点 移动n-i次)
1)判断删除位置i是否合法 合法值为1≤i≤L->length
(2)将第i+1至第n 位的元素依次向前移动一个位置。
(3)表长减1,删除成功返回OK。
Status ListDelete_Sq(SqList*L,inti){
if((i<1)||(i>L->length)) return ERROR;//i值不合法
for (j=i;j<=L->length-1;j++)
L->elem[j-1]=L->elem[j]; //被删除元素之后的元素前移
--(L->length); //表长减1
return OK;}

【分析】算法时间耗费在移动元素操作上。
若删除尾结点,则根本无需移动(特别快);
若删除首结点,则表中n-1个元素全部前移(特别慢);
若要考虑在各种位置删除(共n种可能)的平均移动次数
f aerage  ( n ) = 1 n ∑ i = 1 n ( n − i ) = 1 n ( n − 1 ) n 2 = n − 1 2 f_{\text {aerage }}(n)=\frac{1}{n} \sum_{i=1}^{n}(n-i)=\frac{1}{n} \frac{(n-1) n}{2}=\frac{n-1}{2} faerage (n)=n1i=1n(ni)=n12(n1)n=2n1
顺序表特点同(顺序存储结构特点)

你可能感兴趣的:(数据结构)