线性表合并
运行时限: 1000 ms 单次运行时限: 1000 ms 内存限制: 64 MB
总提交: 365次 通过: 105次
题目描述
将两个有序表A和B合并成一个有序表C
程序输入说明
第1行:有序表A
第2行:有序表B
(A、B中元素均为整数,且元素个数均不超过1000)
程序输出说明
合并后的有序表
程序输入样例
可见格式 带空格和换行符的格式 带空格和换行符的格式说明
1 3 5
3 4 7 9
程序输出样例
Original Transformed 带空格和换行符的格式说明
1 3 3 4 5 7 9
提示
如何读取一行数据?
参考:while(scanf("%d%c",&b[k++],&ch)==2 && ch!='\n');
评判系统的C较低,不支持C99
反复出现了runtime error的问题,原因是数组开的太小了,题目要求1000,我只开了100
#include <stdio.h>
#include <stdlib.h>
# define LIST_INIT_SIZE 1005
typedef struct
{
int *elem;
int length;
int listsize;
} List;
void creat(List *l)
{
char ch;
int i = 0;
l->elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
if(!l->elem)
exit(0);
while(scanf("%d%c",&l->elem[i++],&ch)==2 && ch!='\n');
l->length = i;
}
void display(List *l1,List *l2,List *l3)
{
int i=0,j,a=0,b=0;
int m=l1->length;
int n = l2->length;
while(a<m && b<n)
{
if(l1->elem[a]<l2->elem[b])
l3->elem[i++]=l1->elem[a++];
else
l3->elem[i++]=l2->elem[b++];
}
if(a==m)
{
for(j=b; j<n; j++)
l3->elem[i++]=l2->elem[j];
}
else
{
for(j=a; j<m; j++)
l3->elem[i++]=l1->elem[j];
}
}
int main()
{
List l1,l2,l3;
int i;
creat(&l1);
creat(&l2);
l3.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
display(&l1,&l2,&l3);
int m = l1.length;
int n = l2.length;
for(i=0; i<m+n-1; i++)
printf("%d ",l3.elem[i]);
printf("%d ",l3.elem[m+n-1]);
return 0;
}