C语言 简单的归并问题

dashana1987 2008-08-03 09:49:53
已知线性表LA和LB中的数据元素按值非递减,现要求把LA和LB归并为一个新的线性表LC,且LC中的数据元素扔按值非递减。例:

LA=(3,5,8,11)
LB=(2,6,8,9,11,15,20)

LC=(2,3,5,6,8,8,9,11,11,15,20);


Input
第一行是测试数据的组数n。
每组测试数据占两行,其中第2i+1行(i = 0,1,2,...)首先是LA中的元素个数na,之后是na个元素。第2i+2行首先是LB中的元素个数nb,之后是nb个元素。


Output
n行,每行输出LA、LB合并后的LC。LC的数据之间以空格区分,LC最后一个数据之后没有空格。

建议用两种方式实现,
1)线性表的顺序存储
2)线性表的链式存储


Sample Input
2
2 1 2
1 3
4 3 5 8 11
7 2 6 8 9 11 15 20

Sample Output
1 2 3
2 3 5 6 8 8 9 11 11 15 20
问题补充:这个问题估计 需要时间构思 ,偶会有加分的。(如果有相似的例题给我参考也行。)
...全文
171 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangdeqie 2008-08-03
  • 打赏
  • 举报
回复
这是我对于另一个和你类似贴子回复的内容,楼主,你可以参考下,估计应该对你有帮助!2个在vc6下都能正常运行,我调试过的!
wangdeqie 2008-08-03
  • 打赏
  • 举报
回复

//看看这个,运行环境:vc6
#define OK 1
#define NULL 0
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCRENENT 10
typedef int ElemType;
typedef int status;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode ,*LinkList;
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
void Creat_List(LinkList &L,int n)
{
LinkList p;
L=(LinkList)malloc(sizeof(LNode));
L->next = NULL;
for(int i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}

}
void MergeLList_L(LinkList &La,LinkList &Lb,LinkList &Lc)
{
LinkList pa,pb,pc;
pa=La->next;pb=Lb->next;Lc=pc=La;
while(pa&&pb){
if(pa->data<=pb->data){
pc->next=pa;pc=pa;pa=pa->next;
}
else{
pc->next=pb;pc=pb;pb=pb->next;
}
}
pc->next=pa? pa:pb;
free(Lb);
}
void Print(LinkList p)
{
while(p!=NULL)
{
printf("%3d",p->data);
p=p->next;
}
}
void main()
{
printf("*************************\n");
printf("数值之间用Enter隔离开\n");
printf("*************************\n");
int n,m;
LinkList La,Lb,Lc,p;
printf("\n请La输入线形表的初始长度:");
scanf("%d",&n);
printf("请输入各个元素:\n");
Creat_List(La,n);
printf("La链表的初始化后为:\n");
p=La->next;
Print(p);
printf("\n请Lb输入线形表的初始长度:");
scanf("%d",&m);
printf("请输入各个元素:\n");
Creat_List(Lb,m);
printf("Lb链表的初始化后为:\n");
p=Lb->next;
Print(p);
printf("\n");
printf("La,Lb链表合并成Lc链表后的元素为:\n");
MergeLList_L(La,Lb,Lc);
p=Lc->next;
Print(p);
printf("\n");
}



//这个是C++的,我10楼贴的是C的
#include<iostream.h>
#define ELEM size_t
class link
{
public:
ELEM element;
link *next;
link(const ELEM &elemval,link*nextval=NULL)
{
element=elemval;
next=nextval;
}
link(link *nextval=NULL)
{
next=nextval;
}
~link()
{

};
};
link *creat()
{
link *head,*tail,*s;
head=new link;
tail=head;
int x;
cin>>x;
while(x!=0)
{
s=new link(x);
tail->next=s;
tail=s;
cin>>x;
}
return head;
}
void printlist(link *lp)
{
lp=lp->next;
while(lp!=NULL)
{
cout<<lp->element<<" ";
lp=lp->next;
}
cout<<endl;
}

link *comb(link *L1,link *L2)
{
link *pa=L1->next;
link *pb=L2->next;
link *q,*r=L1;
while (pa!=NULL&&pb!=NULL)
{
if(pa->element<pb->element)
{r->next=pa;
r=pa;
pa=pa->next;
}
else if(pa->element==pb->element)
{
r->next=pa;
r=pa;
pa=pa->next;
pb=pb->next;
}
else
{
r->next=pb;
r=pb;
pb=pb->next;
}
}
if (pa!=NULL)
q=pa;
else
q=pb;
r->next=q;
return L1;
}
void main()
{
cout<<"----当输入为0时,链表输入完毕!----"<<endl;
link *la,*lb,*lc;
la=creat();
lb=creat();
cout<<"la: ";
printlist(la);
cout<<"lb: " ;
printlist(lb);
lc=comb(la,lb);
cout<<"lc(合并后的表): ";
printlist(lc);
}
雪米粥 2008-08-03
  • 打赏
  • 举报
回复
不就是合并排序,随便找一本算法的书都有
基本思路:
1.从A取一个叫a,从B取一个就b
2.比较 a,b
3.如果 a 小 则把 a写入 到 C 然后从A中获取下个 a 跳到 2 处继续
4.如果 b 小 则把 b写入 到 C 然后从B中取下个b 跳到 2 处继续
5.如果 A,取完 则顺序把B剩余的写入到C,同理 B取完则把A的剩余按序写入到C
注:写C是指按顺序写入,每写一个序号加以
dashana1987 2008-08-03
  • 打赏
  • 举报
回复
偶就是不知道 怎么起步啊! 给个步骤也行 ,不需要完整的 程序
11000000 2008-08-03
  • 打赏
  • 举报
回复

这种简单的数据结构问题应该自己可以做的啊,
ximi0000 2008-08-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 whyornot 的回复:]
不就是合并排序,随便找一本算法的书都有
基本思路:
1.从A取一个叫a,从B取一个就b
2.比较 a,b
3.如果 a 小 则把 a写入 到 C 然后从A中获取下个 a 跳到 2 处继续
4.如果 b 小 则把 b写入 到 C 然后从B中取下个b 跳到 2 处继续
5.如果 A,取完 则顺序把B剩余的写入到C,同理 B取完则把A的剩余按序写入到C
注:写C是指按顺序写入,每写一个序号加以
[/Quote]
这是算法,很正确,自己动手实现吧
一定要自己多动手

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧