前言
#define LISTSIZE 100 //线性表初始分配的储存空间大小 #define LISTINCREASEDSIZE 10 //线性表增加的储存空间大小 typedef struct{ ElemType * elem; int length; //长度 int listsize; //分配的存储空间大小 } List;
插入
Status ListInsert (List & list, int i, ElemType e) { // i的合法值为1≤i≤ListLength(list) + 1 if (i<1 l| i>list. length+ 1) return ERROR; // i值不合法 if (list. length >:list. listsize) { //当前存储空间已满,增加分配 newbase = (ElemType * )realloe(L. elem,(list. listsize + LISTINCREMENT) * sizeof (ElemType)) ; if (! newbase ) Exit(OVERFLOW) //存储分配失败 list. elem = newbase;//新基址 list. listsize += LISTITCRMENT;//增加存储容量 q= &(L.elem[(i-1]);//q为插人位置 for(ρ= &(list.elem[list.length - 1]);p>=q;--p) *(p+1)=*p; *q = e;//插人e ++ L. length;//表长增1 return OK; }
删除
Status ListDelete (List &list, int i, ElemType &e) { //在顺序线性表L中删除第i个元素,并用e返回其值 // i的合法值为1≤i≤ListLength(list) if((i < 1) || (i > list.length)) returu ERROR //i值不合法 p= &(L.elem[i-1]); p = &(list.elem[i - 1]); e=*p; q = list.elem + list.length-1;//表尾元素的位置 for ( ++ p; p<=q; ++p) *(p-1) = * p;//被删除元素之后的元素左移 --list.length; return OK; }
合并
解释:非递减排列
递减排列:5、4、3、2、1
递增排列:1、2、3、4、5
非递减排列 :1、2、3、3、4、5
允许出现重复的元素存在
void MergeList (List La, SqList Lb, SqList &Ic) { //已知顺序线性表Ia和Lb的元素按值非递减排列,归并之后得到的表Lc也按值非递减排列 pa = La.elem; //开头 pb = Lb. elem; Lc.listsize = Lc. length = La.1ength+ Lb. length;//获取新表的长度 pc = Lc.elem = (ElemType * )malloc(Lc. listsize * sizeof(ElemType));//获取内存空间 if (!Lc. elen)exit(OVERRFLOW); /存储分配失败 pa_last = La.elem + La. length- 1;//获取表a的最后一个节点 pb_last = Lb. elem + Lb. length- 1; while(pa <= pa_last && pb <= pb.last){ if(*pa<= *pb) *pc++= *pa++;//把当前pa节点插入表c,且pa、pc向下移动一个节点 else *pc++= *pb++; while(pa<= pa._last) *pc++ = *pa++ ; //插入剩余的节点 while(pb<= pb_1ast) *pc++ = *pb++: }