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
结果 不报错,但数据有误
答
求交 和 求并 的逻辑都有点问题,帮你改好了,主要看求交 (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
*/
答
要不要我给你写一个数组实现的