1.线性表是最常用且最简单的一种数据结构。数据元素由数据项组成,在这种情况下,常把数据元素称为记录,含有大量记录的线性表又称文件。
2.抽象数据类型线性表的定义:
3.归并算法:已知线性表LA和LB的数据元素按值非递减有序排列,现要求将LA和LB归并成一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列。(先设LC为空表,设两个指针i和j分别指向LA和LB的某个元素)
void MergeList(List La,List Lb,List &Lc){
InitList(Lc);
i=j=1;k=0;
La_len=ListLength(La);Lb_len=ListLength(Lb);
while((I<=La_len)&&(j<=Lb_len)){
GetElem(La,i,ai);GetElem(Lb,j,bj);
if(ai<=bj){ListInsert(Lc,++k,ai);++I}
else{ListInsert(Lc,++k,bj);++j;}
}
while(I<=La_len){
GetElem(La,i++,ai);ListInsert(Lc,++K,ai);
}
while(j<=Lb_len){
GetElem(Lb,j++,bj);ListInsert(Lc,++k,bj);
}
}
4.线性表的动态分配顺序存储结构
顺序表的初始化操作就是为顺序表分配一个顶定义大小的数组空间,并将线性表的当前长度设置为0。
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储结构的分配增量
typedef struct{
ElenType *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
listsize指示顺序表当前分配的存储空间大小,一旦因插入元素而空间不足,可进行再分配,即为顺序表增加一个大小为存储LISTINCREMENT个数据元素的空间。
Status InitList_Sq(SqList &L){
//构建一个空的线性表L
L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)exit(OVERFLOW);//存储分配失败
L.length=0; //空表长度为0
L.listsize=LIST_INIT_SIZE;//初始存储容量
return OK;
}//InitList_Sq
5.线性操作表的插入操作
在第i个元素之前插入一个元素,需将第n至第i(共n-i+1)个元素向后移动一个位置:
Status ListInsert_Sq(SqList &L,int i,ElemType e){
//在顺序线性表L中第i个位置之前插入新的元素e
//i的合法值为1<=i<=ListLength_Sq(L)+1
if(i<1||i>L.length+1)return ERROR;//i值不合法
if(L.length>=L.listsize){ //当前存储空间已满,增加分配
newbase=(ElemType*)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)exit(OVERFLOW);//存储分配失败
L.elem=newbase; //新基址
L.listsize+=LISTINCREMENT; //增加存储容量
}
q=&(L.elem[i-1]); //q为插入位置
for(p=&(L.elem[L.length-1]);p>=q;--q)*(p+1)=*p; //插入位置及之后的元素右移
*q=e; //插入e
++L.length;//表长加一
return ok;
}//ListInsert_Sq;
6.线性操作表的删除操作
删除第i个元素
Status ListDelete_Sq(SqList &L,int i,ElemType e){
if((i<1)||(i>L.length)) return ERROR; //i值不合法
p=&(L.elem[i-1]); //p为被删除元素的位置
e=*p; //被删除元素的值赋给e
q=L.elem+L.length-1; //表尾元素的位置
for(++P;p<=q;++p)*(p-1)=*p; //被删除元素之后的元素左移
--L.length; //表长减1
return OK;
}//ListDelete_Sq
7.在顺序线性表L中查找第1个值与e满足compare()的元素的位序
int LocateElem_Sq(SqList L,ElemType e,Status(*compare)(ElemType,ElemType)){
//若找到,则返回其在L中的位序,否则返回0
i=1;//i的初值为第一个元素的序列
p=L.elem; //p的初值为第一个元素的存储位置;
while(i<=L.length&&!(*compare)(*p++,e))++I;
if(I<=L.length) return I;
else return 0;
}//LocateElem_Sq
8.顺序表的归并,且新顺序表也按照顺序排列
void MergeList_Sq(SqList La,SqList Lb,SqList &Lc){
pa=La.elem;pb=Lb.elem;
Lc.listsize=Lc.length=La.length+Lb.length;
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 *pc++=*pb++;
}
while(pa<=pa_last)*pc++=*pa++; //插入La的剩余元素
while(pb<=pb_last)*pc++=*pb++; //插入Lb的剩余元素
}//MergeList_Sq