线性表-顺序存储
概述
基本操作:查找、删除、插入、合并
同一性 有穷性 有序性
n个类型相同的数据元素组成的有限序列。
数据元素间是一对一的关系,每个元素有一个直接前驱和一个直接后继。
优点:简单
缺点:插入和删除操作很不方便
查找操作
按序号查找 GetData
按内容查找 Locate
int Locate(Seqlist L, ElemType e)
{ int i = 0;
while((i<=L.last) && (L.elem[i] != e)) i++;
if (i<=L.last)
return (i+1);
return(-1); //若没找到,返回空序列
}
插入操作
插入操作的执行频度与插入位置有关
int InsList(SeqList *L,int i,ElemType e)
{ int k;
if( (i<1) || (i>L->last+2) ) /*首先判断插入位置是否合法*/
{ printf("插入位置i值不合法");return(ERROR);}
if(L->last >= maxsize-1)
{ printf("表已满无法插入"); return(ERROR);}
for(k=L->last; k>=i-1; k--) /*为插入元素而移动位置*/
L->elem[k+1]=L->elem[k];
L->elem[i-1]=e; /*在C语言中数组第i个元素的下标为i-1*/
L->last++;
return(OK); }
Eins = n/2
(n为表的长度,Eins表示在表中插入一元素所需移动元素的平均次数)
删除操作
删除操作的执行频度和删除位置有关
int DelList(SeqList *L, int i, ElemType *e)
{ int k;
if((i<1) || (i>L->last+1))
{printf(“删除位置不合法”);return(ERROR)}
*e = L->elem[i-1];
for(k=i;k<=L->last;k++)
L->elem[k-1] = L->elem[k];
L->last --;
return(OK);
}
Edel = (n-1) /2
(n为表的长度,Edel表示在表中删除一元素所需移动元素的平均次数)
合并操作
已知LA和LB为两个非递减的有序排列线性表,现将两表合并成非递减有序排列的LC
void merge(SeqList *LA, SeqList *LB, SeqList *LC)
{ i=0;j=0;k=0;
while(i<=LA->last && j<=LB->last)
if(LA->elem[i]<LB->elem[i])
{LC->elem[k]=LA->elem[i];i++;k++}
else
{LC->elem[k]=LB->elem[j];j++;k++}
while(i<=LA->last)/*如果LB内的元素已经全部放入LC中,LA内元素尚未取完*/
{LC->elem[k]=LA->elem[i];i++;k++}
while(i<=LB->last)
{LC->elem[k]=LB->elem[i];j++;k++}
LC->last=LA->last+LB->last+1;
}
差集算法
差集:在LA中存在,在LB中不存在的元素
void difference(SeqList *LA, SeqList *LB, SeqList *LC)
{ ElemType aitem, bitem;
ClearList(LC);
for(int Apos=1;Apos<=ListLenghth(LA);Apos++)
{ aitem = GetData(LA,Apos);
bool isExist = false;
for(int Bpos=1;Bpos<=ListLenghth(LB);Bpos++)
{ bitem = GetData(LB,Bpos);
if(bitem == aitem)/*若LA中的元素在LB中出现,设置isExist为True*/
{ isExist = true;
break;
}
if(!isExist)/*若不存在,将该元素放入LC*/
{ InsList(LC,ListLenghth(LC)+1,aitem);}
}
}
}