#define LIST_INIT_SIZE 100//线性表存储空间的初始分配量
#define LISTINCREMENT 10//线性表存储空间的分配增量
typedef struct{
ElemType *elem;//存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
Status InitList_Sq(SqList &L){
//构造一个线性表L
L.elem = (ElemType *) malloc (sizeof (ElemType) * LIST_INIT_SIZE );
if(! L.elem) exit(OVERFLOW);//存储分配失败
L.length = 0;
L.listsize = LIST_INIT_SIZE; //容量
return OK;
}
//插入算法
//一般情况下,在第i(1<= i <=n)个元素之前插入一个元素时,需将第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;
if(L.length >= L.listsize){
newbase = (ElemType *) realloc(L.elem,(L.listsize + LISTINCREMENT) * sizeof(ElemType));
if(! newbase) exit(OVERFLOW);
L.listsize += LISTINCREMENT;//增加存储容量
}
q = &(L.elem[i-1]);//q为插入位置
for( p = &(L.elem[L.length - 1]) ; p>=q; --p) *(p+1) = *p;
*q = e; //插入e
++L.length; //表长增1
return OK;
}
//删除算法
//一般情况下,删除第i(1<= i <= n)个元素时需要将从第 i+1 至第n(共 n-i)个元素一次向前移动一个位置
Sataus ListDelete_Sq(SqList & L,int i , ElemType &e){
//在顺序线性表L中删除第i个元素,并用e返回其值
//i的合法值为 1<= i <=ListLength_Sq(L)
if(i<1 || i>L.length + 1) return ERROR;
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;
return OK;
}
//两个有序线性表的合并
//算法时间复杂度 O(ListLength(LA)+ListLength(LB))
void MergeList(List La,List Lb, List &Lc){
//La和Lb中数据元素按值非递减排列,归并后的数据元素也按非递减排列
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);
}
}
//合并算法,指针表示
void MergeList_Sq(SqList La, SqList Lb, SqList &Lc){
pa = La.elem; pb=Lb.elem;
Lc.listsize = Lc.length = La.Length + Lb.length; //初始化Lc
pc = Lc.elem = (ElemType *) malloc (sizeof(ElemType) * Lc.listsize);
if(! Lc.elem) exit(OVERFLOW);
pa_last = pa + La.length - 1;
pb_last = pb + Lb.length - 1;
while(pa <= pa_last && pb <= pb_last){
if(*pa <= *pb) *(pc++) = *(pa++);
else *(pc++) = *(pb++);
}
while(*pa <= pa_last)
*(pc++) = *(pa++);
while(*pb <= pb_lasst)
*(pc++) = *(pb++);
}