数据结构(纯C语言版)习题 (2)

发布于:2025-03-05 ⋅ 阅读:(18) ⋅ 点赞:(0)

题目:通过键盘,分别输入两个数据元素类型为正整数的集合A和B,以负数输入为结束条件,输出两个集合的交、并、差。从程序完善性上考虑,集合元素输入时,要有检查元素重复的功能。集合可以用数组也可以用链表存储。
样例:

集合的交、并差

输入: A={1,2,3,4,5}        B={3,4,5,6,7}

输出 A交B={3, 4, 5}  A并B={1,2,3,4,5,6,7}  A-B={1, 2}

#include <stdio.h>
#include <stdlib.h>

void input(int** arr, int* size, int* capacity) {
    int num;
    while (scanf("%d", &num) == 1 && num >= 0) {
        int exists = 0;
        for (int i = 0; i < *size; ++i) {
            if ((*arr)[i] == num) {
                exists = 1;
                break;
            }
        }
        if (exists) continue;
        // 对数组进行扩容
        if (*size >= *capacity) {
            int newCapacity = *capacity * 2;
            int* newArr = (int*)realloc(*arr, newCapacity * sizeof(int));
            *arr = newArr;
            *capacity = newCapacity;
        }
        (*arr)[(*size)++] = num;
    }
    // 清除输入缓冲区
    while (getchar() != '\n');
}
int main() {
    // 初始化集合A
    int capacityA = 2;
    int* A = (int*)malloc(capacityA * sizeof(int));
    if (A == NULL) {
        printf("Memory allocation failed.\n");
        return 1;
    }
    int countA = 0;
    printf("A={");
    input(&A, &countA, &capacityA);
    printf("}\n");
    // 初始化集合B
    int capacityB = 2;
    int* B = (int*)malloc(capacityB * sizeof(int));
    if (B == NULL) {
        printf("Memory allocation failed.\n");
        return 1;
    }
    int countB = 0;
    printf("B={");
    input(&B, &countB, &capacityB);
    printf("}\n");
    // 交集
    int inter[100], ci = 0;
    for (int i = 0; i < countA; ++i) {
        for (int j = 0; j < countB; ++j) {
            if (A[i] == B[j]) {
                inter[ci++] = A[i];
                break;
            }
        }
    }
    // 并集
    int uni[200], cu = 0;
    for (int i = 0; i < countA; ++i) uni[cu++] = A[i];
    for (int i = 0; i < countB; ++i) {
        int exists = 0;
        for (int j = 0; j < countA; ++j) {
            if (B[i] == A[j]) {
                exists = 1;
                break;
            }
        }
        if (!exists) uni[cu++] = B[i];
    }
    // 差集
    int diff[100], cd = 0;
    for (int i = 0; i < countA; ++i) {
        int inB = 0;
        for (int j = 0; j < countB; ++j) {
            if (A[i] == B[j]) {
                inB = 1;
                break;
            }
        }
        if (!inB) diff[cd++] = A[i];
    }
    printf("A交B={");
    for (int i = 0; i < ci; ++i) printf("%s%d", i ? ", " : "", inter[i]);
    printf("}\n");
    printf("A并B={");
    for (int i = 0; i < cu; ++i) printf("%s%d", i ? ", " : "", uni[i]);
    printf("}\n");
    printf("A-B={");
    for (int i = 0; i < cd; ++i) printf("%s%d", i ? ", " : "", diff[i]);
    printf("}\n");
    free(A);
    free(B);
    return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到