解题思路:
①:输入两个集合LA,LB
②:求它们的并集
1):遍历LB中的所有元素,看是否存在于LA中
2):若存在则把该元素插入到LA的末尾,并输出LA,换行
3):若不存在,则也输出LA,换行
③:一组数据结束后,换行
注意事项:
1)根据上面求并集过程,LA的输出次数与LB的元素个数有关
即:LB中有n个元素,求并集过程时LA得输出n次,若n=0则不输出
2)题目要求输入集合后,要输出该集合,若集合长度为0,也不输出
3)每次输出占一行
4)每组数据输出完后,空一行
如:LA :1 1
LB:0
①先输出LA元素1换行;②LB没有元素,不输出;③又因为LB长度为0,所以之后的LA输出次数为0;④最后换行
LA:0
LB:0
①:首先,LA没有元素,不输出;②然后LB没有元素,不输出;③又因为LB长度为0,所以之后的LA输出次数为0;④最后换行
LA:0
LB:1 1
①首先,LA没有元素,不输出;②然后输出LB元素1换行;③LB长度为1输出一次LA换行,④最后换行
参考代码:
#include<stdio.h> #include<malloc.h> typedef struct Union_{ int *elem; int length; int size_; }*Union,UNION; void creat_union(Union L); void combin_(Union LA,Union LB); void out_put(Union L); int main() { UNION LA,LB; while(scanf("%d",&LA.size_)!=EOF) { creat_union(&LA); /*输入LB的长度*/ scanf("%d",&LB.size_); creat_union(&LB); /*合并两个集合*/ if(LA.size_!=0||LB.size_!=0) combin_(&LA,&LB); /*每组数据输出后用一行隔开*/ printf("\n"); } return 0; } /*------------------------------------------------*/ void creat_union(Union L) { L->elem=(int *)malloc(L->size_*sizeof(int)); L->length=0; for(int i=0;i<L->size_;i++) {scanf("%d",&L->elem[i]);L->length++;} /*长度不是0时才输出*/ if(L->length!=0) out_put(L); } /*------------------------------------------------*/ void combin_(Union LA,Union LB) { int j; /*为了避免每次插入都要分配,导致分配次数过多,所以直接给LA->elem[],重分配空间大小为 LA->length+LB->length,但这种分配可能会造成空间浪费,还有一种方法是把要插入的元素个数求出来,再分配 但浪费时间*/ if(LA->length+LB->length>LA->size_) LA->elem=(int *)realloc(LA->elem,(LA->length+LB->length)*sizeof(int)); for(int i=0;i<LB->length;i++) { /*判断LB中下标为i的元素在LA中是否存在*/ for(j=0;j<LA->length;j++) { if(LA->elem[j]==LB->elem[i]) break; } /*若果不存在则把LB->elem[i]插入到LA末尾,再插入之前,先重分配空间*/ if(j==LA->length) { LA->elem[LA->length++]=LB->elem[i]; } out_put(LA); } } /*------------------------------------------------*/ void out_put(Union L) { /*除最后一个元素外,其余元素输出后都有空格*/ for(int i=0;i<L->length-1;i++) printf("%d ",L->elem[i]); /*输出最后一个元素*/ printf("%d\n",L->elem[L->length-1]); }
别忘点赞哦-.-!
0.0分
18 人评分
typedef struct { int *elme; int length; int size; }Union, UNION; void creat(Union L); void combin(Union LA, Union LB); void output(Union L); void combin(Union LA, Union LB) { int j; if (LA.length + LB.length>LA.size) LA.elme = (int *)realloc(LA.elme, (LA.length + LB.length) * sizeof(int)); for (int i = 0; i < LB.length; i++) { for (j = 0; j < LA.length; j++) { if (LA.elme[i] == LB.elme[i]) break; } if (j == LA.length) { LA.elme[(LA.length)++] = LB.elme[i]; } output(LA); } } 为什么换了这样以未输出合并后的结果? creat与output函数都能正常运行。
建议将creat_union中的out_out语句移动至main函数,否则自己在键盘上输入时,输入LA后就直接显示LA的元素了,然后才会显示LB,以及LB遍历LA并添加的结果。当然,如果不手动输入数据测试, 而是直接提交到oj就没问题。总之感谢题主!受教了!
C语言训练-素数问题 (C语言代码)浏览:1654 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:896 |
淘淘的名单 (C语言代码)答案错误???浏览:593 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:481 |
WU-格式化数据输出 (C++代码)浏览:1194 |
wu-淘淘的名单 (C++代码)浏览:1331 |
WU-输出正反三角形 (C++代码)浏览:1018 |
WU-C语言程序设计教程(第三版)课后习题12.1 (C++代码)浏览:919 |
蛇行矩阵 (C语言代码)浏览:524 |
1035 题解浏览:778 |