前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【数据结构——线性表】求集合的并、交和差运算(头歌实践教学平台习题)【合集】

【数据结构——线性表】求集合的并、交和差运算(头歌实践教学平台习题)【合集】

作者头像
Rossy Yan
修改2024-12-26 10:19:09
修改2024-12-26 10:19:09
13700
代码可运行
举报
运行总次数:0
代码可运行

任务描述

本关任务:编写一个程序求两个集合的并、交、差。

相关知识

为了完成本关任务,你需要掌握:

  1. 要求采用单链表表示集合,要求输入的每个集合元素都按递增方式排序,且同一个集合中不存在重复的元素。
  2. 求两个集合的并、交、差。
  • 输入集合元素

要求同一个集合中不存在重复的元素,且元素按递增排序。 例如:

代码语言:javascript
代码运行次数:0
复制
ElemType a[4],b[6];
//为数组a输入4个字符,按顺序递增输入
//为数组b输入6个字符,按顺序递增输入
CreateListR(ha,a,4);//创建单链表ha,从数组a中读取元素
CreateListR(hb,b,6);//创建单链表hb,从数组b中读取元素
  • 求两个集合的并、交、差
  • 并集

对于两个给定集合A、B,由两个集合所有元素构成的集合,叫做A和B的并集。 记作:AUB 读作“A并B” 例: {3,5}U{2,3,4,6}= {2,3,4,5,6}

  • 交集

对于两个给定集合A、B,由属于A又属于B的所有元素构成的集合,叫做A和B的交集。 记作: A∩B 读作“A交B” 例: A={1,2,3,4,5},B={3,4,5,6,8},A∩B={3,4,5}

  • 差集

记A,B是两个集合,则所有属于A且不属于B的元素构成的集合,叫做集合A减集合B(或集合A与集合B之差),类似地,对于集合A、B,把集合{x∣x∈A,且x∉B}叫做A与B的差集。 记作:A-B 例: A={1,2,3,4,5},B={3,4,5,6,8},A-B={1,2}

测试说明

平台会对你编写的代码进行测试:

测试输入: a c e f a b d e h i

预期输出: 有序集合A:a c e f 有序集合B:a b d e h i 集合的并集:a b c d e f h i 集合的交集:a e 集合的差集:c f

开始你的任务吧,祝你成功!


我的通关代码:
代码语言:javascript
代码运行次数:0
复制
#include <iostream>
#include <set>
#include <string>
using namespace std;

struct Node {
  char data;
  Node *next;
};

class LinkedList {
public:
  Node *head;

  LinkedList() { head = nullptr; }

  void add_sorted(char value) {
    Node *newNode = new Node();
    newNode->data = value;
    newNode->next = nullptr;

    if (head == nullptr || head->data > value) {
      newNode->next = head;
      head = newNode;
    } else {
      Node *current = head;
      while (current->next != nullptr && current->next->data < value) {
        current = current->next;
      }
      if (current->next == nullptr || current->next->data > value) {
        newNode->next = current->next;
        current->next = newNode;
      }
    }
  }

  void print_list() {
    Node *current = head;
    while (current != nullptr) {
      cout << current->data << " ";
      current = current->next;
    }
    cout << endl;
  }

  set<char> to_set() {
    set<char> result;
    Node *current = head;
    while (current != nullptr) {
      result.insert(current->data);
      current = current->next;
    }
    return result;
  }
};

set<char> union_sets(const set<char> &set_a, const set<char> &set_b) {
  set<char> result = set_a;
  result.insert(set_b.begin(), set_b.end());
  return result;
}

set<char> intersection_sets(const set<char> &set_a, const set<char> &set_b) {
  set<char> result;
  for (char elem : set_a) {
    if (set_b.find(elem) != set_b.end()) {
      result.insert(elem);
    }
  }
  return result;
}

set<char> difference_sets(const set<char> &set_a, const set<char> &set_b) {
  set<char> result;
  for (char elem : set_a) {
    if (set_b.find(elem) == set_b.end()) {
      result.insert(elem);
    }
  }
  return result;
}

int main() {
  LinkedList list_a, list_b;
  string input;

  cout << "有序集合A:";
  getline(cin, input);
  for (char c : input) {
    if (c != ' ') {
      list_a.add_sorted(c);
    }
  }
  getline(cin, input);
  for (char c : input) {
    if (c != ' ') {
      list_b.add_sorted(c);
    }
  }
  list_a.print_list();
  cout << "有序集合B:";
  list_b.print_list();

  set<char> set_a = list_a.to_set();
  set<char> set_b = list_b.to_set();

  set<char> union_set = union_sets(set_a, set_b);
  set<char> intersection_set = intersection_sets(set_a, set_b);
  set<char> difference_set = difference_sets(set_a, set_b);

  cout << "集合的并集:";
  for (char c : union_set) {
    cout << c << " ";
  }
  cout << endl;

  cout << "集合的交集:";
  for (char c : intersection_set) {
    cout << c << " ";
  }
  cout << endl;

  cout << "集合的差集:";
  for (char c : difference_set) {
    cout << c << " ";
  }
  cout << endl;

  return 0;
}

测试结果:
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 任务描述
  • 相关知识
  • 测试说明
    • 我的通关代码:
    • 测试结果:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档