C语言编写一个程序实现两个有序(从小到大)顺序表合并成为一个顺序表,合并后的结果放在第一个顺序表中。

#include <stdio.h>
#include <malloc.h>
#define OK 1
#define LIST_INIT_SIZE 100
#define OVERFLOW 0
#define exit -2
typedef int ElemType;
typedef int Status;

struct SqList{
ElemType *elem;
int length;
int listsize;
};

Status InitList_Sq(SqList *L) //初始化一个顺序表
{ L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem) exit(OVERFLOW);
L->length=0;
L->listsize=LIST_INIT_SIZE;
return OK;
}

void Create_Sq(SqList *L) //创建顺序表
{ int i,n;
printf("创建一个有序表:\n");
printf("输入有序表中元素的个数:");
scanf("%d",&n);
L->length=n;
for(i=0;i<n;i++){
printf("输入第%d个元素的值:",i+1);
scanf("%d",&L->elem[i]);
printf("\n");
}
}

void Disp_Sq(SqList L) //输出顺序表中的各数据元素
{ int i,n;
n=L->length;
for(i=0;i<n;i++)
printf("%5d",L->elem[i]);
printf("\n");
}

void Combine(SqList *La, SqList Lb)//合并顺序表
{

int pa,pb,pc,N,i,j;
pa=La->length;
pb=Lb->length;
La->listsize=la->length=pa+pb;
pc=la.elem=(ElemType*)malloc(la.listsize*sizeof(ElemType));
pa->last=la->elem+la->length-1;
pb->last=Lb->elem+Lb->length-1;
while(pa<=pa->last&&pb<=pb.last){
if(*pa<=*pb)*pc++=*pa++;

else
{
*pc++=*pb++;
}while(pa<=pa->last) *pc++=*pa++;
while(pb<=pb.last) *pc++=*pb++;}

void main()
{SqList &L1,&L2;
InitList_Sq(&L1);
InitList_Sq(&L2);
Create_Sq(&L1);
Disp_Sq(G L1);printf("\n");
Create_Sq(&L2);
DispSq_Sq(L2);printf("\n");
Combine(L1,L2);
DispSq_Sq(L1);}

合并函数可能有点问题,因为是根据2个顺序表合并放到第3个顺序表的函数改的,但是其他函数也提示有错误。
问题不在合并函数,是之前的函数,提示的错误很奇怪

你提到的“奇怪错误”是由于你的exit宏和函数重名了,所以预处理器会把程序中的exit用-1代替,所以出错。

另外,你的合并函数也是错误的,无法达到要求,整个程序修改如下:

//---------------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h> //注意这里,exit()函数要用到这个文件,这个文件已经包含了malloc()等函数的声明
#define OK 1
#define LIST_INIT_SIZE 100
#define OVERFLOW 0
#define EXIT -2 //************注意这里
typedef int ElemType;
typedef int Status;

typedef struct {
ElemType *elem;
int length;
int listsize;
}SqList;

Status InitList_Sq(SqList *L)
{ L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem) exit(OVERFLOW);
L->length=0;
L->listsize=LIST_INIT_SIZE;
return OK;
}

void Create_Sq(SqList *L)
{ int i,n;
printf("创建一个有序表:\n");
printf("输入有序表中元素的个数:");
scanf("%d",&n);
L->length=n;
for(i=0;i<n;i++){
printf("输入第%d个元素的值:",i+1);
scanf("%d",&L->elem[i]);
printf("\n");
}
}

void Disp_Sq(SqList *L) //************注意这里
{ int i,n;
n=L->length;
for(i=0;i<n;i++)
printf("%5d",L->elem[i]);
printf("\n");
}

void Combine(SqList *la,SqList *lb) //************注意这里,此函数被重新编写
{
ElemType *pa=la->elem,*pb=lb->elem ;
int i,j,k,len_a=la->length,len_b=lb->length;
if ((la->elem=malloc((len_a+len_b)*sizeof(ElemType)))==NULL) exit(OVERFLOW);

for (k=i=j=0; i<len_a&&j<len_b; ) {
if (pa[i]<pb[j]) la->elem[k++]=pa[i++];
else la->elem[k++]=pb[j++];
}
while (i<len_a)
la->elem[k++]=pa[i++];
while (j<len_b)
la->elem[k++]=pb[j++];

la->length=k;
la->listsize=k;

free(pa);

}

void main()
{SqList L1,L2;
InitList_Sq(&L1);
InitList_Sq(&L2);
Create_Sq(&L1);
Disp_Sq(&L1);
printf("\n");
Create_Sq(&L2);
Disp_Sq(&L2); //************注意这里
printf("\n");
Combine(&L1,&L2);
Disp_Sq(&L1); //************注意这里
}
//---------------------------------------------------------------------------
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-04-13
合并两个顺序表的关键步骤
int i,j;
i = j = 0;
for(int k=0; k<n1+n2; k++) //n1为第一个顺序表的大小,n2为第二个顺序表的大小
if(List1[i] <= List2[j])
List1[k] = List1[i];
i++;
else
List1[k] = List2[j];
j++;
以上步骤还有一个最关键的一步就是,比如List1大小为10,那声明11个空间给它,最后一个位置放一个比较大的数,这个数主要是当哨兵,这样当List1遍历完剩下最后一个数的时候,条件List1[i] <= List2[j]总是不成立,List2也一样,也要加一个哨兵
有什么不懂可以call我追问

问题不在合并函数,是之前的函数,提示的错误很奇怪

追答

就像楼下说的一样,你DispSq_Sq这个函数名是不是写错了,

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网