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

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

结果 不报错,但数据有误

img

求交 和 求并 的逻辑都有点问题,帮你改好了,主要看求交 (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
*/

要不要我给你写一个数组实现的