typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
typedef int Boolean; // Boolean是布尔类型,其值是TRUE或FALSE
typedef int ElemType;
using namespace std;
struct SqList
{
ElemType *elem; // 存储空间基址
int length; // 当前长度
int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位)
};
Status InitList(SqList &L) // 算法2.3
{
// 操作结果:构造一个空的顺序线性表
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;
}
int ListLength(SqList L)
{
// 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数
return L.length;
}
Status GetElem(SqList L,int i,ElemType &e)
{
// 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)
// 操作结果:用e返回L中第i个数据元素的值
if(i<1||i>L.length)
exit(ERROR);
e=*(L.elem+i-1);
return OK;
}
Status ListInsert(SqList &L,int i,ElemType e) // 算法2.4
{
// 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1
// 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1
ElemType *newbase,*q,*p;
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.elem=newbase;
L.listsize+=LISTINCREMENT;
}
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]); p>=q; --p) *(p+1)=*p;
*q=e;
++L.length;
return OK;
}
Status compare(ElemType e1,ElemType e2)
{
if(e1==e2)
{
return TRUE;
}
else return FALSE;
}
int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))
{
// 初始条件:顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)
// 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。
// 若这样的数据元素不存在,则返回值为0。算法2.6
int i=1;
int *p;
p=L.elem;
while(i<=L.length&&!(*compare)(*p++,e)) ++i;
if(i<=L.length) return i;
else return 0;
}
void MergeList(SqList La,SqList Lb,SqList &Lc)
{
InitList(Lc);
int i,j,k;
i=1;
j=1;
k=0;
int La_len=ListLength(La);
int Lb_len=ListLength(Lb);
int a,b;
while((i<=La_len)&&(j<=Lb_len))
{
GetElem(La,i,a);
GetElem(Lb,j,b);
if(a<=b)
{
ListInsert(Lc,++k,a);
i++;
}
else
{
ListInsert(Lc,++k,b);
j++;
}
}
while(i<=La_len)
{
GetElem(La,i++,a);
ListInsert(Lc,++k,a);
}
while(j<=Lb_len)
{
GetElem(Lb,j++,b);
ListInsert(Lc,++k,b);
}
}
int main()
{
SqList La,Lb,Lc;
InitList(La);
InitList(Lb);
ListInsert(La,1,3);
ListInsert(La,2,5);
ListInsert(La,3,8);
ListInsert(La,4,11);
ListInsert(Lb,1,2);
ListInsert(Lb,2,6);
ListInsert(Lb,3,8);
ListInsert(Lb,4,9);
ListInsert(Lb,5,11);
ListInsert(Lb,6,15);
ListInsert(Lb,7,20);
printf("La原始元素:\n");
for(int i=1; i<=4; i++)
{
int e;
GetElem(La, i, e);
printf("%d ",e);
}
printf("\n");
printf("Lb原始元素:\n");
for(int i=1; i<=7; i++)
{
int e;
GetElem(Lb, i, e);
printf("%d ",e);
}
printf("\n");
MergeList( La, Lb,Lc);
printf("最终插入结果:\n");
// printf("%d\n",La.length);
for(int i=1; i<=Lc.length; i++)
{
int e;
GetElem(Lc, i, e);
printf("%d ",e);
}
}