设A和B两个顺序表,其元素按从小到大的顺序排列。编写一个算法将A和B的全部元素合并到有序顺序表C中,并编写主函数测试算法。
//设A和B两个顺序表,其元素按从小到大的顺序排列。编写一个算法将A和B的全部元素合并到有序顺序表C中,并编写主函数测试算法。
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 4
#define OVERFLOW 0
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef struct {
ElemType *elem;
int length;
}SqList;
int InitList_Sq(SqList &L);
int CreateList(SqList &L);
int CreateLists(SqList &A,SqList &B);
void PrintList(SqList &L);
int meger(SqList &A, SqList &B, SqList &C);
int main()
{
//初始化
SqList A;
InitList_Sq(A);
printf("\n线性表A初始化成功...\n\n");
printf("-----------------------------------------------------------\n");
SqList B;
InitList_Sq(B);
printf("\n线性表B初始化成功...\n\n");
printf("-----------------------------------------------------------\n");
SqList C;
InitList_Sq(C);
printf("\n线性表C初始化成功...\n\n");
printf("-----------------------------------------------------------\n");
if(CreateLists(A,B))
{
printf("-----------------------------------------------------------\n");
printf("合并中...\n\n");
if(meger(A,B,C))
{
printf("合并顺序表成功...\n");
//显示合并后的顺序表
PrintList(C);
}
else{
printf("顺序表未合并成功,可能合并后的元素个数超过存储空间...\n\n");
}
}
else
{
printf("顺序表未创建成功,未能进行合并...\n");
}
return 0;
}
//初始化顺序表
int InitList_Sq(SqList &L) //构造一个空的顺序表L
{
L.elem =(int *)malloc(sizeof(int)*MAXSIZE);; //为顺序表分配空间
if(!L.elem){
exit(OVERFLOW);
} //如果存储分配失败
L.length=0; //空表长度为0
return OK;
}
//创建顺序表
int CreateList(SqList &L)
{
printf("请输入要创建的顺序表中的元素的个数:");
int maxlength=0;
scanf("%d",&maxlength);
int i=0;
int arr=0;
if(maxlength<1 || maxlength>MAXSIZE){ //判断要创建的元素个数是否合理
return ERROR;
}
printf("请按递增顺序输入元素:");
for(i=0;i<maxlength;i++) //通过循环将输入的值赋值给顺序表
{
scanf("%d",&arr);
L.elem[i]=arr;
L.length++;
}
}
//创建顺序表A,B
int CreateLists(SqList &A,SqList &B)
{
//创建顺序表
printf("顺序表A创建中...\n\n");
if(CreateList(A))
{
printf("创建顺序表A成功...\n");
//显示顺序表
PrintList(A);
}
else{
printf("顺序表未创建成功,可能创建的元素个数超过存储空间...\n\n");
return ERROR;
}
printf("-----------------------------------------------------------\n");
printf("顺序表B创建中...\n\n");
if(CreateList(B))
{
printf("创建顺序表B成功...\n");
//显示顺序表
PrintList(B);
}
else{
printf("顺序表未创建成功,可能创建的元素个数超过存储空间...\n\n");
return ERROR;
}
return OK;
}
//显示顺序表
void PrintList(SqList &L)
{
int i;
printf("\n顺序表中的元素为:\n");
for(i=0;i<L.length;i++) //通过循环将线性表里面的元素取出来
{
printf("%d ",L.elem[i]);
}
printf("\n\n");
}
//合并顺序表
int meger(SqList &A, SqList &B, SqList &C)
{
if(A.length+B.length>MAXSIZE){
return ERROR;
}
int i=0, j=0, k=0; //i扫描A,j扫描B
while (i< A.length && j<B.length)
{
if(A.elem[i]<B.elem[j]) //判断顺序表A中的元素是否小于B
{
C.elem[k]=A.elem[i]; //如果小于B中的元素,则将A中的元素放入C中
i++; //继续扫描A中的元素
k++;
}
else
{
C.elem[k]=B.elem[j]; //否则 将B中的元素放入C中
j++;
k++; //继续扫描B中的元素
}
}
while(i<A.length) { //若A未扫描完,则将A剩余的元素加到C中
C.elem[k] = A.elem[i];
i++;
k++;
}
while(j<B.length) { //若B未扫描完,则将B剩余的元素加到C中
C.elem[k]=B.elem[j];
j++;
k++;
}
C.length = k;
return OK;
}