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

#include<stdio.h>
#define maxsize 100 //宏定义常量表示线性表的最大长度
struct Sqlist
{
int elem[maxsize]; //线性表占用的数组空间
int last; //记录线性表中最后一个元素在数组elem[]中的位置
};

void initlist(Sqlist &L) //初始化线性表
{
L.last=0;
}

void unionlist(Sqlist &la,Sqlist &lb) //求集合la和lb的并集
{
int i,j,e;
for(i=0;i<lb.last;i++)
{
e=lb.elem[i]; j=0; //用e记录线性表lb中的元素
while((j<la.last)&&(la.elem[j]!=e)) j++; //扫描顺序表la,直到找到值为e的元素,或扫描到表尾还没找到
if(j==la.last)
{
la.elem[la.last]=e;la.last++; //将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",&la.elem[i],&c); //输入la的各元素,各元素之间用空格分开
if(c=='\n') //当输入Enter时结束输入
break;
}
printf("请输入集合b的元素\n");

for(i=0;i<maxsize;i++)
{
scanf("%d%c",&lb.elem[i],&c);
if(c=='\n')
break;
}
unionlist(la,lb);
printf("集合a与b的并集为:\n");
for(i=0;i<la.last;i++)
printf("%-4d",la.elem[i]);
printf("\n");
}

以上是我写的源代码,但是不能正确输出结果(把线性表初始化为0或maxsize都没用),求C语言大神帮我改下,到底是哪里出了问题。

#include<stdio.h>
#define maxsize 100 //宏定义常量表示线性表的最大长度
struct Sqlist
{
int elem[maxsize]; //线性表占用的数组空间
int last; //记录线性表中最后一个元素在数组elem[]中的位置
};

void initlist(Sqlist &L) //初始化线性表
{
L.last=0;
}

void unionlist(Sqlist &la,Sqlist &lb) //求集合la和lb的并集
{
int i,j,e;
for(i=0;i<lb.last;i++)
{
e=lb.elem[i]; j=0; //用e记录线性表lb中的元素
while((j<la.last)&&(la.elem[j]!=e)) j++; //扫描顺序表la,直到找到值为e的元素,或扫描到表尾还没找到
if(j==la.last)
{
la.elem[la.last]=e;la.last++; //将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",&la.elem[i],&c); //输入la的各元素,各元素之间用空格分开
la.last++;
if(c=='\n') //当输入Enter时结束输入
break;
}
printf("请输入集合b的元素\n");

for(i=0;i<maxsize;i++)
{
scanf("%d%c",&lb.elem[i],&c);
lb.last++;
if(c=='\n')
break;
}
unionlist(la,lb);
printf("集合a与b的并集为:\n");
for(i=0;i<la.last;i++)
printf("%-4d",la.elem[i]);
printf("\n");
}
你的链表长度没有随着链表元素的增加而增加,我改过了,你试下,祝好运
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2018-03-22
C语言求两个顺序表的并集函数为:
void fun(int a[],int b[],int n,int m,int c[]){
int i=0,j=0,k=0;
for (k=0;k<n+m;k++){
if(i>=n||a[i]>b[j]) {c[k]=b[j];j++;continue;}
if(j>=m||a[i]<b[j]) {c[k]=a[i];i++;continue;}
}
}
void main(){
int a[10],b[10],c[20];
printf("input a");
for(i=0;i<10;i++)scanf("%d",a+i);
printf("input b");
for(i=0;i<10;i++)scanf("%d",b+i);
fun(a,b,10,10,c);
for(i=0;i<20;i++)printf("%d ",c[i]);
}
第2个回答  2015-10-14
void fun(int a[],int b[],int n,int m,int c[]){
int i=0,j=0,k=0;
for (k=0;k<n+m;k++){
if(i>=n||a[i]>b[j]) {c[k]=b[j];j++;continue;}
if(j>=m||a[i]<b[j]) {c[k]=a[i];i++;continue;}
}
}
void main(){
int a[10],b[10],c[20];
printf("input a");
for(i=0;i<10;i++)scanf("%d",a+i);
printf("input b");
for(i=0;i<10;i++)scanf("%d",b+i);
fun(a,b,10,10,c);
for(i=0;i<20;i++)printf("%d ",c[i]);
}
第3个回答  2014-04-03
我没看完,但是我想提一个问题。就是我感觉这个算法是不是不是很好哦。。直接把一个顺序表的元素通过双重循环,作比较,然后输出不是很好吗?追问

那应该怎么样写算法呢?

追答

int i,j;
int Seqlist3[M];
M=1;
for(i = 0; iSeqlist2.length&&Seqlist[i]==Seqlist2[j]){
Seqlist2[ j] = null;

}
else if(Seqlist1.length<=Seqlist2.elngth&&Seqlist[i] == Seqlist2[j]){
Seqlist1[i] = null;
}
}
}
for(int a =0;a<Seqlist1.length;a++){
printf("%d",&Seqlist1[a]);
}
for(int b =0;b<Seqlist2.length;a++){
printf("%d",&Seqlist2[a]);
}

这个算法是不是更加简单了。。你调试一下,有不懂得可以继续追问

相似回答