#include<stdio.h>
#define MAXSIZE 100
typedef struct SeqList//顺序表的存储结构
{
int elem[MAXSIZE];
int length;
}SqList;
void MergeList_Sq(SqList LA,SqList LB,SqList &LC)
{
int *p1,*p2,*q;
LC.length=LA.length+LB.length;
p1=LA.elem;
p2=LB.elem;
q=LC.elem;
while(p1&&p2)
{
if(*p1<=*p2)
{
*q=*p1;
p1++;
}
else
{
*q=*p2;
p2++;
}
q++;
}
while(p1)
{
*q=*p1;
p1++;
q++;
}
while(p2)
{
*q=*p2;
p2++;
q++;
}
}
int Input(SqList &L,int n)
{
if(n<1||n>MAXSIZE)
return 0;
int i;
L.length=0;
for(i=0;i<n;i++)
{
printf("请输入第%d个元素:",i+1);
scanf("%d",&L.elem[i]);
L.length++;
}
return 1;
}
int Show(SqList &L)
{
int i;
for(i=0;i<L.length;i++)//注意不要写i<n,表长是不断变化的,不总是等于n
printf("%d ",L.elem[i]);
return 1;
}
int main()
{
SqList LA,LB,LC;
int m,n;
printf("请输入LA元素个数:");
scanf("%d",&m);
Input(LA,m);
printf("顺序有序表LA为:\n");
Show(LA);
printf("\n");
printf("请输入LB元素个数:");
scanf("%d",&n);
Input(LB,n);
printf("顺序有序表LB为:\n");
Show(LB);
printf("\n");
printf("合并后的顺序有序表LC为:\n");
MergeList_Sq(LA,LB,LC);
Show(LC);
return 0;
}
合并函数有问题。p1&&p2是错误的。必须要考虑length的问题。如果p1移动到length及length以后的位置,就不应该合并了。
找到一个漏洞,今天重新修改完善了,供参考:
#include<stdio.h>
#define MAXSIZE 100
typedef struct SeqList//顺序表的存储结构
{
int elem[MAXSIZE];
int length;
}SqList;
void MergeList_Sq(SqList LA,SqList LB,SqList &LC)
{
SqList t;
int p1=0,p2=0,q=0,tp;
LC.length=LA.length+LB.length;
if(LC.length > MAXSIZE) return;
while(p1 < LA.length && p2 < LB.length)
{
if(LA.elem[p1] < LB.elem[p2])
{
LC.elem[q++]=LA.elem[p1++];
}
else if(LA.elem[p1] > LB.elem[p2])
{
LC.elem[q++]=LB.elem[p2++];
}
else{
LC.elem[q++]=LA.elem[p1++];
LC.elem[q++]=LB.elem[p2++];
}
}
(p1 >= LA.length)?(t=LB,tp=p2):(t=LA,tp=p1);
while(tp < t.length)
LC.elem[q++]=t.elem[tp++];
}
int Input(SqList &L,int n)
{
if(n<1||n>MAXSIZE)
return 0;
int i;
L.length=0;
for(i=0;i<n;i++)
{
printf("请输入第%d个元素:",i+1);
scanf("%d",&L.elem[i]);
L.length++;
}
return 1;
}
int Show(SqList &L)
{
int i;
for(i=0;i<L.length;i++)//注意不要写i<n,表长是不断变化的,不总是等于n
printf("%d ",L.elem[i]);
return 1;
}
int main()
{
SqList LA,LB,LC;
int m,n;
printf("请输入LA元素个数:");
scanf("%d",&m);
Input(LA,m);
printf("顺序有序表LA为:\n");
Show(LA);
printf("\n");
printf("请输入LB元素个数:");
scanf("%d",&n);
Input(LB,n);
printf("顺序有序表LB为:\n");
Show(LB);
printf("\n");
printf("合并后的顺序有序表LC为:\n");
MergeList_Sq(LA,LB,LC);
Show(LC);
system("pause");
return 0;
}