解题思路:
①:输入两个集合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换行,④最后换行

2018-03-21 23-33-20屏幕截图.png


参考代码:

#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]);

}


别忘点赞哦-.-!

点赞(25)
 

0.0分

15 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 5 条评论

自由无畏 1年前 回复TA
大佬受我一拜  真强
简单 4年前 回复TA
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函数都能正常运行。
肥猫 5年前 回复TA
建议将creat_union中的out_out语句移动至main函数,否则自己在键盘上输入时,输入LA后就直接显示LA的元素了,然后才会显示LB,以及LB遍历LA并添加的结果。当然,如果不手动输入数据测试, 而是直接提交到oj就没问题。总之感谢题主!受教了!
Manchester 6年前 回复TA
@验题君 么么哒~~
验题君 6年前 回复TA
越来越66~~ 已被推荐~