c++单链表实现集合交并集运算(附带排序)

文章目录


前言

用链表实现一个集合,并实现集合的交并运算,测试数据在最后。


提示:以下是本篇文章正文内容,下面案例可供参考

一、需求分析

 

二、模块设计

定义集合

首先需要定义一个节点类和链表类,节点类里面存储着成员变量数据域和next指针,同时将链表类声明为友元类。链表类里面存放着成员变量头结点指针,和集合的元素个数,以及与集合功能相关的成员函数。

这样就能够通过一个链表类来表示一个集合。

建立集合

通过默认构造函数建立一个空集合,然后通过void create_gather()函数向集合中输入元素,

在输入过程中,使用int find_element(int a)函数检查输入元素与集合元素是否重复,完成去重操作,用0结束输入。

求交集

 使用LinkList intersection(LinkList& a, LinkList& b)函数进行求交集,实现的逻辑是将集合a和一个空集合b传入函数,然后对当前链表表示集合与集合a进行求交集,将相交的元素通过void insert_element(int a)函数插入到空集合b中,最后所求交集即为集合b。

求并集

使用LinkList sum(LinkList& a, LinkList& b)函数进行求并集,实现的逻辑同样是将集合a和一个空集合b传入函数,然后通过LinkList& operator=(const LinkList& other)函数将集合a赋值给集合b,然后再将当前链表表示集合中的每一个元素通过void insert_element(int a)插入到集合b中,插入函数也通过int find_element(int a)函数完成去重,最后所求并集即为集合b.

排序

使用void sort_gather()函数进行排序,实现的逻辑是冒泡排序。

输出元素

使用void show_gather()函数对集合进行输出,实现逻辑是将集合遍历一遍,然后输入节点中的数据。

三、具体实现

完整代码:

#include<iostream>
using namespace std;
class Node {
	int data;
	Node* next;
	friend class LinkList;
};

class LinkList {
	Node* head;
	int size;
public:
	LinkList() { head = NULL; size = 0; }     //默认构造
	LinkList& operator=(const LinkList& other);// 赋值构造函数
	void create_gather();//创建集合
	int find_element(int a); //查找元素
	void insert_element(int a); //插入元素
	LinkList intersection(LinkList& a, LinkList& b);  //求交集
	LinkList sum(LinkList& a, LinkList& b);  //求并集
	void show_gather();//显示集合元素
	void sort_gather();//排序
	bool is_empty(); //判空
};
void LinkList::create_gather() {       //创建
	head = new Node; 
	head->next = NULL;
	int data;
	Node* q = head;
	cin >> data;
	while (data!=0) {
		if(find_element(data)==-100){
			Node* p = new Node;
			p->data = data;
			p->next = NULL;
			q->next = p;
			q = p;
			size++;
		}	
		cin >> data;
	}
}
int LinkList::find_element(int a) {      //查找
	if (is_empty()) return -100;
	Node* p = head->next;
	while (p) {
		if (a == p->data) return a;
		p = p->next;
	}
	return -100;
}
void LinkList::insert_element(int a) {     //插入
	if (is_empty()) {
		head = new Node;
		head->next = NULL;
		Node* p = new Node;
		p->data = a;
		p->next = NULL;
		head->next = p;
		size++;
	}
	else {
		if (find_element(a) == -100) {
			Node* p = new Node;
			p->data = a;
			p->next = NULL;
			p->next = head->next;
			head->next = p;
			size++;
		}
	}
}
bool LinkList::is_empty() {     //判空
	if (size == 0) return true;
	return false;
}
LinkList& LinkList:: operator=(const LinkList& other) {    //赋值构造
	if (this == &other) return *this;
	size = other.size;
	head = new Node;
	head = other.head;
	Node* p = other.head;
	Node* q = head;
	while(p){
		q = new Node;
		q->next =p->next;
		q = p;
		p = p->next;
	}
	return *this;
}
LinkList LinkList::intersection(LinkList& a, LinkList& b) {    //交集
	Node* p = head->next;
	while (p) {
		Node* q = a.head->next;
		while (q) {
			if (p->data == q->data) {
				b.insert_element(p->data);
				b.size++;
			}
			q = q->next;
		}
		p = p->next;
	}
	return b;
}
LinkList LinkList::sum(LinkList& a, LinkList& b) {    //并集
	b = a; Node* p = head->next;
	for (int i = 0; i < size; i++) {
		b.insert_element(p->data);
		b.size++;
		p = p->next;
	}
	return b;
}
void LinkList::sort_gather() {       //排序
	Node* p = head->next;
	while (p) {
		Node* q = p->next;
			while (q) {
				int temp;
				if (p->data > q->data) {
					temp = p->data;
					p->data = q->data;
					q->data = temp;
				}
				q = q->next;

		}
			p = p->next;
	}
}
void LinkList::show_gather() {           //显示
	if (is_empty()) { cout << endl; return; }
	sort_gather();
	Node* p = head->next;
	while (p) {
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}
int main() {
	LinkList a, b, c;
	cout << "请输入集合a元素:" << endl;
	a.create_gather();
	cout << "请输入集合b元素:" << endl;
	b.create_gather();
	cout << "a集合元素为:";
	a.show_gather();
	cout << "b集合元素为:";
	b.show_gather();
	c = a.intersection(b, c);
	cout << "交集为:";
	c.show_gather();
	c = a.sum(b, c);
	cout << "并集为:";
	c.show_gather();
	
}

测试数据:

实际输出:


 逗号格式我就没改了,这里使用0结束输入。

 

  • 4
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值