```c
#include
#include<string.h>
#include
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE]; /*存储数组元素*/
int length; /*表当前长度*/
}List;/*数组存储类型名*/
int ListLength(List L);
Status GetElem(List L,int i,ElemType *e);
Status ListInsert(List *L,ElemType i,ElemType e);
void MergeList(List La, List Lb,List *Lc);
Status ListEmpty(List L);
int main()
{
int i;
char ch;
List La,Lb,Lc;
La.length=0;
Lb.length=0;
for(i=0;;i++)
{
scanf("%d%c",&La.data[i],&ch);
La.length++;
if(ch=='\n')
break;
}
for(i=0;;i++)
{
scanf("%d%c",&Lb.data[i],&ch);
Lb.length++;
if(ch=='\n')
break;
}
if(!ListEmpty(La)&&!ListEmpty(Lb))
MergeList(La,Lb,&Lc);
for(i=0;i<Lc.length;i++)
printf("%d ",Lc.data[i]);
return 0;
}
/*返回L中数据元素个数*/
int ListLength(List L)
{
return L.length;
}
/*用e返回L中第i个数据元素的值*/
Status GetElem(List L,int i,ElemType *e)
{
if(L.length==0||i<1||i>L.length)
return ERROR;
*e=L.data[i-1];
return OK;
}
/*在L中第i个位置之前插入定的数据元素e,L的长度+1*/
Status ListInsert(List *L,ElemType i,ElemType e)
{
int k;
if(i==L->length+1)
L->data[i-1]=e;
else
{
for(k=L->length-1;k>=i-1;k--)
{
L->data[k+1]=L->data[k];
}
L->data[i-1]=e;
}
L->length++;
}
/*归并La和Lb得到新的表Lc,Lc的数据元素也按值非递减排列*/
void MergeList(List La, List Lb,List *Lc)
{
int i=1,j=1,k=0;
int La_len,Lb_len,Lc_len;
int ai,bj;
La_len=ListLength(La);
Lb_len=ListLength(Lb);
Lc_len=ListLength(*Lc);
while(i<=La_len&&i<=Lb_len) /*表La和表Lb均非空*/
{
GetElem(La,i,&ai);
GetElem(Lb,j,&bj);
if(ai<=bj)
{
ListInsert(Lc,++k,ai);
++i;
}
else
{
ListInsert(Lc,++k,bj);
++j;
}
}
while(i<=La_len) /*表La非空且表Lb空*/
{
GetElem(La,i++,&ai);
ListInsert(Lc,++k,ai);
}
while(j<=Lb_len) /*表Lb非空且表La空*/
{
GetElem(Lb,j++,&bj);
ListInsert(Lc,++k,bj);
}
}
Status ListEmpty(List L)
{
if(L.length==0)
return TRUE;
else
return FALSE;
}
```
在主函数里,添加表Lc的长度初始值,如下:
List La,Lb,Lc;
La.length=0;
Lb.length=0;
Lc.length=0; // 修改 添加表 Lc的长度初始化
MergeList()函数里:while(i<=La_len && j<=Lb_len) //while(i<=La_len&&i<=Lb_len) 修改
整体修改如下,改动处见注释,供参考:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE];//存储数组元素
int length;//表当前长度
}List;//数组存储类型名
int ListLength(List L);
Status GetElem(List L,int i,ElemType *e);
Status ListInsert(List *L,ElemType i,ElemType e);
void MergeList(List La, List Lb,List *Lc);
Status ListEmpty(List L);
int main()
{
int i;
char ch;
List La,Lb,Lc;
La.length=0;
Lb.length=0;
Lc.length=0; // 修改
for(i=0;;i++)
{
scanf("%d%c",&La.data[i],&ch);
La.length++;
if(ch=='\n')
break;
}
for(i=0;;i++)
{
scanf("%d%c",&Lb.data[i],&ch);
Lb.length++;
if(ch=='\n')
break;
}
if(!ListEmpty(La)&&!ListEmpty(Lb))
MergeList(La,Lb,&Lc);
for(i=0;i<Lc.length;i++)
printf("%d ",Lc.data[i]);
return 0;
}
//返回L中数据元素个数
int ListLength(List L)
{
return L.length;
}
//用e返回L中第i个数据元素的值
Status GetElem(List L,int i,ElemType *e)
{
if(L.length==0||i<1||i>L.length)
return ERROR;
*e=L.data[i-1];
return OK;
}
//在L中第i个位置之前插入定的数据元素e,L的长度+1
Status ListInsert(List *L,ElemType i,ElemType e)
{
int k;
if(i==L->length+1)
L->data[i-1]=e;
else
{
for(k=L->length-1;k>=i-1;k--)
{
L->data[k+1]=L->data[k];
}
L->data[i-1]=e;
}
L->length++;
}
//归并La和Lb得到新的表Lc,Lc的数据元素也按值非递减排列
void MergeList(List La, List Lb,List *Lc)
{
int i=1,j=1,k=0;
int La_len,Lb_len,Lc_len;
int ai,bj;
La_len=ListLength(La);
Lb_len=ListLength(Lb);
Lc_len=ListLength(*Lc);
while(i<=La_len && j<=Lb_len)
//while(i<=La_len&&i<=Lb_len)修改
{
GetElem(La,i,&ai);
GetElem(Lb,j,&bj);
if(ai<=bj)
{
ListInsert(Lc,++k,ai);
++i;
}
else
{
ListInsert(Lc,++k,bj);
++j;
}
}
while(i<=La_len) //表La非空且表Lb空
{
GetElem(La,i++,&ai);
ListInsert(Lc,++k,ai);
}
while(j<=Lb_len) //表Lb非空且表La空
{
GetElem(Lb,j++,&bj);
ListInsert(Lc,++k,bj);
}
}
Status ListEmpty(List L)
{
if(L.length==0)
return TRUE;
else
return FALSE;
}
参考GPT和自己的思路:这段代码实现的功能是将两个有序表合并成一个新的有序表,并输出新表的元素。但是在主函数中调用 MergeList 后并没有输出结果,可能是因为没有正确处理输出格式。
要检查和修改这个问题,可以在 MergeList 函数末尾添加一行代码,输出合并后的表 Lc:
for(i=0;i<Lc.length;i++)
printf("%d ",Lc.data[i]);
printf("\n"); // 加上换行输出
这样就会输出合并后表 Lc 的所有元素,每个元素后面跟一个空格和一个换行符。