question:
建立两个非递减顺序表A,B,合并为一个顺序表但不创建新的顺序表,相同数据不插入。比如:
A:1 2 3 4 5
B:2 7
可把长度短的插入到长度长的顺序表中,即A:1 2 3 4 5 7
实现代码如下:
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;
typedef struct {
ElemType *elem;
int length;
}SqList; //结构体定义顺序表
Status InitList_Sq(SqList *L){
L->elem=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
//L.elem=new ElemType[MAXSIZE]; //为什么不能用new
if(!L->elem) exit(OVERFLOW);
L->length=0;
return OK;
} //顺序表的初始化函数
Status ListInsert_Sq(SqList *L,int i,ElemType e){
int j;
if(i<1||i>L->length+1) return ERROR;
if(L->length==MAXSIZE) return ERROR;
for(j=L->length-1;j>=i-1;j--){
L->elem[j+1]=L->elem[j];
}
L->elem[i-1]=e;
++L->length;
return OK;
} // 插入函数
void ListDisplay(SqList *L){
int i;
for(i=0;i<=L->length-1;i++){
if(i==L->length-1) printf("%d",L->elem[i]);
else printf("%d ",L->elem[i]);
}
} //输出顺序表
int GetElem(SqList *L,int i){
return L->elem[i-1];
} //获取顺序表中第i个数据
void MergeList_Sq(SqList *LA,SqList *LB){
int i,j,e,k;
for(i=1;i<=LB->length;i++){
e=GetElem(LB,i);
k=0;
for(j=0;j<LA->length;j++){
if(LA->elem[j]==e) k++;
}
if(k==0){
for (j=0;j<LA->length;j++){
if(j==(LA->length-1)&&e>LA->elem[-1]) {ListInsert_Sq(LA,LA->length+1,e); break;}
else if (e>LA->elem[j]&&e<LA->elem[j+1]) {ListInsert_Sq(LA,j+2,e); break;}
}
}
}
} //合并函数
void Input_Sq(SqList *L){
int i;
printf("输入元素:");
for(i=0;i<L->length;i++){
scanf("%d",&L->elem[i]);
}
} //顺序表输入数据函数
int main(){
SqList A,B;
int e,a,b,c;
if(InitList_Sq(&A)) printf("A顺序表已建成!!\n");//调用初始化函数
printf("请输入顺序表长 ");
scanf("%d",&A.length);
Input_Sq(&A);
if(InitList_Sq(&B)) printf("B顺序表已建成!!\n");
printf("请输入顺序表长 ");
scanf("%d",&B.length);
Input_Sq(&B);
printf("输出顺序表A的元素:");
ListDisplay(&A);
printf("\n");
printf("输出顺序表B的元素:");
ListDisplay(&B);
//比较长度合并
if(A.length>=B.length){
MergeList_Sq(&A,&B);
printf("\n合并后:");
ListDisplay(&A);
printf("\n");
}
else {
MergeList_Sq(&B,&A);
printf("\n合并后:");
ListDisplay(&B);
printf("\n");
}
return 0;
}