数据布局(纯C语言版)习题 (2)

打印 上一主题 下一主题

主题 934|帖子 934|积分 2802

题目:通过键盘,分别输入两个数据元素类型为正整数的聚集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}

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void input(int** arr, int* size, int* capacity) {
  4.     int num;
  5.     while (scanf("%d", &num) == 1 && num >= 0) {
  6.         int exists = 0;
  7.         for (int i = 0; i < *size; ++i) {
  8.             if ((*arr)[i] == num) {
  9.                 exists = 1;
  10.                 break;
  11.             }
  12.         }
  13.         if (exists) continue;
  14.         // 对数组进行扩容
  15.         if (*size >= *capacity) {
  16.             int newCapacity = *capacity * 2;
  17.             int* newArr = (int*)realloc(*arr, newCapacity * sizeof(int));
  18.             *arr = newArr;
  19.             *capacity = newCapacity;
  20.         }
  21.         (*arr)[(*size)++] = num;
  22.     }
  23.     // 清除输入缓冲区
  24.     while (getchar() != '\n');
  25. }
  26. int main() {
  27.     // 初始化集合A
  28.     int capacityA = 2;
  29.     int* A = (int*)malloc(capacityA * sizeof(int));
  30.     if (A == NULL) {
  31.         printf("Memory allocation failed.\n");
  32.         return 1;
  33.     }
  34.     int countA = 0;
  35.     printf("A={");
  36.     input(&A, &countA, &capacityA);
  37.     printf("}\n");
  38.     // 初始化集合B
  39.     int capacityB = 2;
  40.     int* B = (int*)malloc(capacityB * sizeof(int));
  41.     if (B == NULL) {
  42.         printf("Memory allocation failed.\n");
  43.         return 1;
  44.     }
  45.     int countB = 0;
  46.     printf("B={");
  47.     input(&B, &countB, &capacityB);
  48.     printf("}\n");
  49.     // 交集
  50.     int inter[100], ci = 0;
  51.     for (int i = 0; i < countA; ++i) {
  52.         for (int j = 0; j < countB; ++j) {
  53.             if (A[i] == B[j]) {
  54.                 inter[ci++] = A[i];
  55.                 break;
  56.             }
  57.         }
  58.     }
  59.     // 并集
  60.     int uni[200], cu = 0;
  61.     for (int i = 0; i < countA; ++i) uni[cu++] = A[i];
  62.     for (int i = 0; i < countB; ++i) {
  63.         int exists = 0;
  64.         for (int j = 0; j < countA; ++j) {
  65.             if (B[i] == A[j]) {
  66.                 exists = 1;
  67.                 break;
  68.             }
  69.         }
  70.         if (!exists) uni[cu++] = B[i];
  71.     }
  72.     // 差集
  73.     int diff[100], cd = 0;
  74.     for (int i = 0; i < countA; ++i) {
  75.         int inB = 0;
  76.         for (int j = 0; j < countB; ++j) {
  77.             if (A[i] == B[j]) {
  78.                 inB = 1;
  79.                 break;
  80.             }
  81.         }
  82.         if (!inB) diff[cd++] = A[i];
  83.     }
  84.     printf("A交B={");
  85.     for (int i = 0; i < ci; ++i) printf("%s%d", i ? ", " : "", inter[i]);
  86.     printf("}\n");
  87.     printf("A并B={");
  88.     for (int i = 0; i < cu; ++i) printf("%s%d", i ? ", " : "", uni[i]);
  89.     printf("}\n");
  90.     printf("A-B={");
  91.     for (int i = 0; i < cd; ++i) printf("%s%d", i ? ", " : "", diff[i]);
  92.     printf("}\n");
  93.     free(A);
  94.     free(B);
  95.     return 0;
  96. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

雁过留声

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表