阿Hun
2021-10-01 18:07
采纳率: 92.9%
浏览 116

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

  • 好问题 提建议
  • 收藏

2条回答 默认 最新

  • 英雄哪里出来 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
    */
    
    已采纳该答案
    评论
    解决 无用 1
    打赏 举报
  • 19ty53 2021-10-01 19:01

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

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题