# C语言数据结构顺序表求交集并集

``````
#include <stdio.h>
#include <malloc.h>
#define LISTSIZE 20

typedef struct {
int * elem;
int length;
int ListSize;
}SqList;

int main() {
SqList L1,L2,L3,L4; //L3做交集 L4做并集
int i,j,a,b=0,k,q;
L1.elem = (int*)malloc(LISTSIZE * sizeof(int));
L1.ListSize = LISTSIZE;
printf("输入表L1的数据个数以及数据：\n");
scanf("%d",&L1.length);
if (L1.length > LISTSIZE) {
printf("输入的数据过多，请重新输入！\n");
return 0;
}
for (i = 0; i < L1.length; i++) {
scanf("%d",&L1.elem[i]);
}
printf("L1的数据是：\n");
for (i = 0; i < L1.length; i++) {
printf("%d.",L1.elem[i]);
}

printf("\n\n");

L2.elem = (int*)malloc(LISTSIZE * sizeof(int));
L2.ListSize = LISTSIZE;
printf("输入表L2的数据个数以及数据：\n");
scanf("%d", &L2.length);
if (L2.length > LISTSIZE) {
printf("输入的数据过多，请重新输入！\n");
return 0;
}
for (i = 0; i < L2.length; i++) {
scanf("%d", &L2.elem[i]);
}
printf("L2的数据是：\n");
for (i = 0; i < L2.length; i++) {
printf("%d.", L2.elem[i]);
}

if (L1.length > L2.length) {     //将两表中较短的表的长度记录，方便一会儿做交集的时候，短的走完就不往下走了

a = L2.length;
}
else a = L1.length;

printf("\n\n");

L3.elem = (int*)malloc(LISTSIZE * sizeof(int));
L3.ListSize = LISTSIZE;
L3.length = a;

for (i = 0; i < a; i++) {
int n, m;
n = L1.elem[i];
for (j = 0; j < a;j++) {
m = L2.elem[j];
if (n == m) {
L3.elem[i] = n;
b++;                   //b代表L3的长度
}
}
}

printf("表L1与L2中共同的数据是：\n");
for (i = 0; i < b; i++) {
printf("%d.",L3.elem[i]);
}

printf("\n\n");

L4.elem = (int*)malloc(LISTSIZE * sizeof(int));
L4.ListSize = LISTSIZE;
L4.length = L1.length + L2.length;           //先假定4的长度是1+2

for (i = 0; i < L1.length; i++) {
L4.elem[i] = L1.elem[i];                   //先把表1的数据放入表4
}
k = 0;
for (i = 0; i < L1.length; i++) {                    //通过比较，把表2中表4没有的数据送入表4
for (j = 0; j < L2.length; j++) {
if (L1.elem[j] != L2.elem[i]) {
k++;                                     //k做标志，满足条件代表一轮比完了
if (k == L2.length) {
L4.elem[L1.length + i] = L2.elem[i];
q = 1;                              //q是满足条件的个数
q++;

}
}
}
}

L4.length = L4.length - q;
printf("表L1与表L2的并集是：\n");
for (i = 0; i < L4.length; i++) {
printf("%d.", L4.elem[i]);
}

return 0;
}
``````

L1:3,8,5,11
L2:22,6,8,3,15,11,20

• 写回答

#### 2条回答默认 最新

• 英雄哪里出来 2021年博客之星Top1 2021-10-02 08:37
关注

求交 和 求并 的逻辑都有点问题，帮你改好了，主要看求交 （L3 相关逻辑）和 求并 （L4相关逻辑）即可，测试数据在文件结束。

``````#include <stdio.h>
#include <malloc.h>
#define LISTSIZE 20

typedef struct {
int * elem;
int length;
int ListSize;
}SqList;

int main() {
SqList L1,L2,L3,L4; //L3做交集 L4做并集
int i,j;
L1.elem = (int*)malloc(LISTSIZE * sizeof(int));
L1.ListSize = LISTSIZE;
printf("输入表L1的数据个数以及数据：\n");
scanf("%d",&L1.length);
if (L1.length > LISTSIZE) {
printf("输入的数据过多，请重新输入！\n");
return 0;
}
for (i = 0; i < L1.length; i++) {
scanf("%d",&L1.elem[i]);
}
printf("L1的数据是：\n");
for (i = 0; i < L1.length; i++) {
printf("%d.",L1.elem[i]);
}

printf("\n\n");

L2.elem = (int*)malloc(LISTSIZE * sizeof(int));
L2.ListSize = LISTSIZE;
printf("输入表L2的数据个数以及数据：\n");
scanf("%d", &L2.length);
if (L2.length > LISTSIZE) {
printf("输入的数据过多，请重新输入！\n");
return 0;
}
for (i = 0; i < L2.length; i++) {
scanf("%d", &L2.elem[i]);
}
printf("L2的数据是：\n");
for (i = 0; i < L2.length; i++) {
printf("%d.", L2.elem[i]);
}

printf("\n\n");

L3.elem = (int*)malloc(LISTSIZE * sizeof(int));
L3.ListSize = LISTSIZE;
L3.length = 0;

for (i = 0; i < L1.length; i++) {
int n, m;
n = L1.elem[i];
for (j = 0; j < L2.length;j++) {
m = L2.elem[j];
if (n == m) {
L3.elem[ L3.length++ ] = n;
break;
}
}
}

printf("表L1与L2中共同的数据是：\n");
for (i = 0; i < L3.length; i++) {
printf("%d.",L3.elem[i]);
}

printf("\n\n");

L4.elem = (int*)malloc(LISTSIZE * sizeof(int));
L4.ListSize = LISTSIZE;
L4.length = L1.length + L2.length;           //先假定4的长度是1+2

for (i = 0; i < L2.length; i++) {
L4.elem[i] = L2.elem[i];
}
L4.length = L2.length;
for (i = 0; i < L1.length; i++) {
for (j = 0; j < L2.length; j++) {
if (L1.elem[i] == L2.elem[j]) {
break;
}
}
if (j == L2.length) {
L4.elem[ L4.length++ ] = L1.elem[i];
}
}

printf("表L1与表L2的并集是：\n");
for (i = 0; i < L4.length; i++) {
printf("%d.", L4.elem[i]);
}

return 0;
}

/*
4
3 5 8 11

7
22 6 8 3 15 11 20
*/
``````
本回答被题主选为最佳回答 , 对您是否有帮助呢?
评论

• 系统已结题 10月10日
• 已采纳回答 10月2日
• 创建了问题 10月1日

#### 悬赏问题

• ¥115 不能成功安装R语言pathview包
• ¥15 LEfSe在线分析Galaxy报错，如何解决？
• ¥15 GTEx数据库eqtl数据整理求教学
• ¥20 AI自瞄 KMBOXNET
• ¥15 初学者，自己写的js俄罗斯代码，谁能帮我调试并找出问题所在！！ 自己调试了好多遍！快乱了，崩溃了！
• ¥15 IEC61850库中IedServer_setControlHandler函数的作用
• ¥15 qt 编译webengine 支持 webgl
• ¥15 Cadence安装后pcb design可以打开，Capture CIS闪退
• ¥15 python中post报错
• ¥20 关于#java#的问题：根据学生字段为集中分班还是分散分班，如何根据规则集合实现综合分班，分班规则由集合数据顺序由强到弱