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

  • Post author:
  • Post category:其他



文章目录




前言

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



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



一、需求分析



二、模块设计

定义集合

首先需要定义一个节点类和链表类,节点类里面存储着成员变量数据域和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结束输入。





版权声明:本文为weixin_61567621原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。