用C语言实现集合的并集

用C语言实现集合的并集,第1张

用两个数组表示集合元素
对于AUB=C
先把A的数据 复制到C里面
然后 遍历B数组,每个元素和A对比,如果存在 则略过,否则添加到C中。
等到的C
即为并集

可以先对两个数组排序,然后用归并排序的思想进行合并,例如:
//---------------------------------------------------------------------------
#include <stdioh>
#include <stdlibh>
int hb(int a,int na,int b,int nb,int nc)
/求a和b两个升序数组的并集,返回保存并集的数组的首地址,并将并集的长度保存到nc中,na和nb分别是a和b数组的元素个数/
{
int c=NULL;
int i=0,j=0,t=0;;
while (i<na&&j<nb)
{
if (a[i]<b[j]) {
if (!c) c=malloc(sizeof(int));
else c=realloc(c,sizeof(int)(t+1));
c[t++]=a[i++];
}
else if (b[j]<a[i]) {
if (!c) c=malloc(sizeof(int));
else c=realloc(c,sizeof(int)(t+1));
c[t++]=b[j++];
}
else if (a[i]==b[j]) {
if (i<j) i++;
else j++;
}
}
while (i<na)
{
c=realloc(c,sizeof(int)(t+1));
c[t++]=a[i++];
}
while (j<nb)
{
c=realloc(c,sizeof(int)(t+1));
c[t++]=b[j++];
}
nc=t;
return c;
}
int comp(const void a, const void b)
{
return (int )a-(int )b;
}
int main(void)
{
int a[]={1,4,3,2,5};
int b[]={1,5,6,3,9};
int c=NULL,i=0,t=0;
qsort(a,5,sizeof(int),comp); /排序/
qsort(b,5,sizeof(int),comp); /排序/
c=hb(a,5,b,5,&t); /求并集/
for (i = 0; i<t; i++) { /输出并集/
printf("%d\t",c[i]);
}
free(c); /释放空间/
return 0;
}
//---------------------------------------------------------------------------

您好,这是求并集的算法描述,链式结构实现的,参考一下
算法描述
LNode Merge_LinkList(LNode La, LNode Lb)
/ 合并以La, Lb为头结点的两个有序单链表 /
{ LNodeLc, pa , pb, pc, ptr ;
Lc=La; pc=La ; pa=La->next ; pb=Lb->next ;
while (pa!=NULL && pb!=NULL)
{ if (pa->datadata)
{ pc->next=pa ; pc=pa ; pa=pa->next ; }
/ 将pa所指的结点合并,pa指向下一个结点 /
if (pa->data>pb->data)
{ pc->next=pb; pc=pb ; pb=pb->next ; }
/ 将pa所指的结点合并,pa指向下一个结点 /
if (pa->data==pb->data)
{ pc->next=pa ; pc=pa ; pa=pa->next ;
ptr=pb; pb=pb->next; free(ptr); }
/ 将pa所指的结点合并,pb所指结点删除 /
}
if (pa!=NULL) pc->next=pa ;
else pc->next=pb; /将剩余的结点链上/
free(Lb) ;
return(Lc) ;
}

string[] a1={"1","2"};
string[] a2={"2","3"};
Ilist<string> jiaoji=new List<string>;
Ilist<string> bingji=new List<string>;
//jiaoji
foreach(string s1 in a1)
{
foreach(string s2 in a2)
{
if (s1=s2)
jiaojiadd(s1);
}
}
// bingji
foreach(string s in a1)
{
bingjiadd(s);
}
foreach(string s in a2)
{
bingjiadd(s);
}
//qudiaochongfu
for(int i=0 ;i<bingjilength;i++)
{
for(int j=i+1;j<bingjilength;j++)
{
if(bingji[i]==bingji[j])
bingjiremove(j);
}
}
// 直接写的 可能有些小问题 自己调试

C#30 可以使用以下方法
char[] aa={'a','b','a','d'};
char[] bb={'a','c','d','z'};
var tt=aaUnion(bb);
前提using SystemLinq;

纯C的代码如下。 基本是先对两个数组排序, 然后再求并集。
代码如下:
#include <stdioh>
#include <stdlibh>
int compare (const void a, const void b);
void FindUnion(const int pa1, const int pa2, const size_t m, const size_t n);
int main(int argc, char argv[])
{
int arr1[] = {6, 5, 4, 2, 1};
int arr2[] = {5, 7, 3, 2};
size_t len1, len2;

len1 = sizeof(arr1)/sizeof(arr1[0]);
len2 = sizeof(arr2)/sizeof(arr2[0]);

qsort(arr1, len1, sizeof(int), compare);
qsort(arr2, len2, sizeof(int), compare);
FindUnion(arr1, arr2, len1, len2);

return 0;
}
void FindUnion(const int pa1, const int pa2, const size_t m, const size_t n)
{
int i = 0, j = 0;

while(i < m && j < n)
{
if(pa1[i] < pa2[j])
printf(" %d ", pa1[i++]);
else if(pa1[i] > pa2[j])
printf(" %d ", pa2[j++]);
else
{
printf(" %d ", pa2[j++]);
i++;
}
}

while(i < m)
printf(" %d ", pa1[i++]);

while(j < n)
printf(" %d ", pa2[j++]);
}
int compare (const void a, const void b)
{
return ( (int)a - (int)b );
}
输出:
1 2 3 4 5 6 7


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13411195.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-31
下一篇 2023-07-31

发表评论

登录后才能评论

评论列表(0条)

保存