C语言求两个顺序表的并集

C语言求两个顺序表的并集,第1张

#include<stdioh>
#define maxsize 100 //宏定义常量表示线性表的最大长度
struct Sqlist
{
int elem[maxsize]; //线性表占用的数组空间
int last; //记录线性表中最后一个元素在数组elem[]中的位置
};
void initlist(Sqlist &L) //初始化线性表
{
Llast=0;
}
void unionlist(Sqlist &la,Sqlist &lb) //求集合la和lb的并集
{
int i,j,e;
for(i=0;i<lblast;i++)
{
e=lbelem[i]; j=0; //用e记录线性表lb中的元素
while((j<lalast)&&(laelem[j]!=e)) j++; //扫描顺序表la,直到找到值为e的元素,或扫描到表尾还没找到
if(j==lalast)
{
laelem[lalast]=e;lalast++; //将lb中值不为e的元素加入到la中,表长为la,lb去掉相同元素后的两表长之和
}
}
}
void main()
{
int i;
char c;
struct Sqlist la,lb;
printf("初始化顺序表\n");
initlist(la);
initlist(lb);
printf("请输入集合a的元素\n");
for(i=0;i<maxsize;i++)
{
scanf("%d%c",&laelem[i],&c); //输入la的各元素,各元素之间用空格分开
lalast++;
if(c=='\n') //当输入Enter时结束输入
break;
}
printf("请输入集合b的元素\n");

for(i=0;i<maxsize;i++)
{
scanf("%d%c",&lbelem[i],&c);
lblast++;
if(c=='\n')
break;
}
unionlist(la,lb);
printf("集合a与b的并集为:\n");
for(i=0;i<lalast;i++)
printf("%-4d",laelem[i]);
printf("\n");
}
你的链表长度没有随着链表元素的增加而增加,我改过了,你试下,祝好运

给你个思路吧,首先将A集合的元素读入一个数组a,然后将B集合的元素读取出来与该数组a各个元素进行对比,如果出现相同的,则提取下一个元素,如果都不相同则将该元素添加到数组a中。完成B集合的遍历后转至C集合,同样的方法便利完C集合,最后数组a中的元素就是它们的并集了。

qsort(A,a-1,sizeof(A[0]),cmp); a-1改成a 是元素个数
你这个解法复杂度度太大 直接用个set存就行拉
不会用set 就用类似归并的方法A,B排序 判前一个有没和当前的重复

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

ACM?
写了一个简单的给你。
编译通过了,功能实现了,不过性能嘛。。。
#include <stdioh>
#include <stdlibh>
int contains(int a[],int length,int value) {
int i;
for(i=0;i<length;i++) {
if(a[i]==value) return length;
}
a[length]=value;
return ++length;
}
main() {
int n,m;
int a[1000],b[1000];
int i,length;
while(scanf("%d",&n)!=EOF) {
length=n;
for(i=0;i<n;i++)
scanf("%d",a+i);

scanf("%d",&m);
for(i=0;i<m;i++) {
scanf("%d",b+i);
length=contains(a,length,b[i]);
}
for(i=0;i<length;i++) {
printf("%d ",a[i]);
}
}
//system("pause");
}

个人觉得函数功能的安排有点缺乏灵活性。看看下面程序(有关函数重新设计了一下):
#include<iostream>
using namespace std;
//输入数组元素
void input(int a[], int n)
{
for (int i = 0; i < n; i++)
cin >> a[i];
}
//判断key是否在数组x中
int found(int x[], int n,int key){
int i,f=0;
for(i=0; i<n && !f; i++)
f=x[i]==key;
return f;
}
//求并
void a_union(int a[],int b[],int c[], int na, int nb, int nc){
int i,n=na;
for(i=0; i<na; i++)
c[i]=a[i];
for(i=0; i<nb; i++)
if(!found(c,n,b[i])){
c[n]=b[i];
n++;
}
nc=n; //并的长度
}
//输出数组元素
void output(int a[], int n)
{
int i;
for(i=0; i<n; i++)
cout <<a[i] <<" ";
cout <<endl;
}
int main (void)
{
const int n=10,i=10;
int l;
int a[n];
int b[i];
int c[n+i];
cout <<"输入数组a" << '\n';
input(a,n);
cout <<"输入数组b" << '\n';
input(b,i);
//求并
a_union(a,b,c,n,i,&l);
//输出数组c
output(c,l);
system("PAUSE");
return 0;
}


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

原文地址: http://outofmemory.cn/yw/13358668.html

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

发表评论

登录后才能评论

评论列表(0条)

保存