应用c语言编程:求两个有序集合的并集

【编程要求】
1. 编写函数 int bing (int a[ ], int m, int b[ ], int n, int c[ ]),长度分别为m和 n的一维数组a, b,表示两个有序集合,求a,b的并集c,并且并集也是有序的, 函数返回并集c中元素个数。
2. 编写main函数,声明数组s1,s2,并用测试数据初始化,调用bing 函数求数组s1,s2的并集s3,将s3数组中的数据输出到屏幕及文件myf2.out中,最后将你本人的学号和姓名保存到文件myf2.out中。
【测试数据与运行结果】
数组s1初始数据为:12 15 16 18 29
数组s2初始数据为:9 18 23 29 31
输出:9 12 15 16 18 23 29 31
【要求】
1. 源程序文件名为myf2.c,输出结果文件名为myf2.out。
2. 数据文件的打开、使用、关闭均用C语言标准中缓冲文件系统的文件操作函数实现。

周三前要,做出来的,符合要求的给奖励分,做出来给我信箱发来:wangxinran-zw@163.com,
然后在下面留下你发的帐号,我会除了100分另再给你奖励分
3楼给的有问题,那个虽然可以执行,但执行出来,有重复的

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define NUMBER1 7
#define NUMBER2 5
void createCollect(int [],int);
void display(int [],int);
int main()
{
int collection1[NUMBER1];
int collection2[NUMBER2];
int collection3[NUMBER1+NUMBER2];
int i,j,label=0;
createCollect(collection1,NUMBER1);

for(j = 0;j < NUMBER2;j++)
{
collection2[j]=j*2;
}

printf("集合1:");
display(collection1,NUMBER1);

printf("集合2:");
display(collection2,NUMBER2);

for(i = 0; i < NUMBER1;i++)
{
//从集合1中取出元素,去遍历集合2中的所有元素
for(j = 0;j < NUMBER2;j++)
{
//如果相同则跳出遍历
if(collection1[i]==collection2[j])
break;
}
//判断:此时存在两种情况1) 当前集合1的元素与集合2的元素相同
//2)遍历完了集合2的数组后不存在相同的元素
if(j == NUMBER2)
{
collection3[label]=collection1[i];
label++;
}

}

//把集合2的所有元素存进collection3中
for(j = 0;j < NUMBER2;j++)
{
collection3[label++]=collection2[j];
}

printf("集合1与集合2的并集为:\n");
display(collection3,label);

return 0;
}
//随机生成一个不含重复元素的数组
void createCollect(int num[],int count)
{
//randValue:临时随机数存放变量
//condition:循环生成不重复的条件
int i,j,randValue,condition;
srand(time(NULL));
for(i=0;i<count;i++)
{
condition=1;
while(condition){
randValue=1+(int)rand()%10;
for(j = 0;j <= i;j++){
if(i==0){//第一个数不可能存在重复数,可以直接赋值
condition=0;
break;
}
if(randValue==num[j])
break;
if(randValue!=num[j]&&j==i-1)//当生成的随机数与当前数组最后一位不同并且下标相等时
{
condition=0;
break;
}
}
}
num[i]=randValue;
}
}
//打印数组
void display(int num[],int count)
{
int i;
for(i=0;i<count;i++)
{
printf("%d\t",num[i]);
}
printf("\n");
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-12-13
/* vc6.0 编译通过 */
#include <stdio.h>
int bing (int a[ ], int m, int b[ ], int n, int c[ ])
{
int i,j,t;
int temp;
int sum=0;
for(i=0;i<m+n;i++)
{
if (i<m)
c[i]=a[i];
else
c[i]=b[i-5];
}
for(i=0;i<m+n;i++)
for(j=0;j<i;j++)
{

if(c[j]>c[j+1])
{
temp=c[j];
c[j]=c[j+1];
c[j+1]=temp;
}
}
for(j=0;j<n+m-1;j++)
if(c[j]==c[j+1])
{
for(t=j;t<n+m;t++)
c[t]=c[t+1];
sum++;
}
return m+n-sum;
}
void main(void)
{
FILE *fp;
int s1[5]={12,15,16,18,29};
int s2[5]={9,18,23,29,31};
int s3[10]={0};
int re=0;
int i;
fp=fopen("myf2.out","wr");
re = bing(s2,5,s1,5,s3);
for(i=0;i<re;i++)
{
printf("s3[%d] is %d \n",i,s3[i]);
fprintf(fp,"s3[%d] is %d \n",i,s3[i]);
}
fclose(fp);
}

/*
我已经测试了啊,没有重复,你把你的测试数据发上来,我试一下
*/本回答被网友采纳
第2个回答  2010-12-19
已经发到你邮箱了本回答被提问者采纳
第3个回答  2010-12-13
我们好像考试是求交集,不是并集,你提问错了
第4个回答  2010-12-13
我也在学
相似回答