(C++)链表实现集合的交并差

本文介绍如何使用C++通过链表实现集合的交、并、差集操作。第一版着重讲解基本概念和实现思路。

链表实现集合的交并差

第一版

#include <iostream>
#include <string>
using namespace std;


//可以用于类似于检测卷面相似度 或者 答题卡答案的比对
struct LNode
{
	char data;
	struct LNode *next;
};
LNode* createList()
{
	int n;
	LNode* head = new LNode;
	//在堆上生成,函数结束后才可以保存
	LNode* pre = head;
	cout << "请输入字符串的字母个数" << endl;
	cin >> n;
	while(n<=0)
	{
		cout << "请输入一个大于零的数" << endl;
		cin >> n;
	}
	cout << "请输入字符串" << endl;
	for (int i = 0; i < n; i++)
	{
		LNode* p = new LNode;
		cin >> p->data;

		pre->next = p;
		pre = p;		
		p->next = NULL;
	}
	return head;
}
//遍历单链表函数
void display(LNode* head)
{
	LNode* p = head->next;
	
	while(p != NULL)
	{
		cout << p->data;
		p = p->next;
		cout << "  ";
	}
	cout << endl;
}
//排序
void sort(LNode* head)
{
	LNode* cur = NULL;
	LNode* tag = NULL;
 
	cur = head;
 
	while(cur != tag)
	{
		while(cur->next != tag)
		{
			if(cur->data > cur->next->data )
			{
				char tmp = cur->data ;
				cur->data = cur->next->data ;
				cur->next->data = tmp;
			}
			cur = cur->next ;
		}
		tag = cur;
		cur = head ;
	}
	
}
//消除相同元素
void erase(LNode *head)
{
	LNode *p = head->next;
	if(!p)
		return;
	while(p != NULL)
	{
		LNode *q = p;
		LNode *temp;
		while(q != NULL && q->next != NULL)
		{
			if (q->next->data == p->data)
			{
				temp = q->next;
				q->next = temp->next;
				delete temp;
			}
			else q=q->next;
		}
		p = p->next;
	}
}
//求交集
void JiaoJi(LNode* head1,LNode* head2)
{
	LNode* p = head1->next;
	LNode* q = head2->next;

	while(p != NULL && q != NULL)
	{
		if(p->data == q->data )
		{
			cout << p->data << "  ";
			q = q->next;
			p = p->next;
		}
		else if(p->data < q->data)
		{
			p = p->next;
		}
		else if(p->data > q->data)
		{
			q = q->next;
		}	
	}

}
//求并集
void BingJi(LNode* head1,LNode* head2)
{
	LNode* p = head1->next;
	LNode* q = head2->next;
	
	while(p != NULL && q != NULL)
	{
		if(p->data < q->data)
		{
			cout << p->data << "  ";
			p = p->next;
		}
		else if (p->data > q->data)
		{
			cout << q->data <<"  ";
			q = q->next;
		}
		else if (p->data == q->data)
		{
			cout << p->data << "  ";
			q = q->next;
			p = p->next;
		}
	}
	while(p != NULL)
	{
		cout << p->data << "  ";
		p = p->next;
	}
	while(q != NULL)
	{
		cout << q->data <<"  ";
		q = q->next;
	}
}
//求差集
void ChaJi(LNode* head1,LNode* head2)
{
	LNode* p = head1->next;
	LNode* q = head2->next;
	
	while(p != NULL && q != NULL)
	{
		if(p->data < q->data)
		{
			cout << p->data << "  ";
			p = p->next;
		}
		else if (p->data > q->data)
		{
			cout << q->data <<"  ";
			q = q->next;
		}
		else if (p->data == q->data)
		{
			q = q->next;
			p = p->next;
		}
	}
	while(p != NULL)
	{
		cout << p->data << "  ";
		p = p->next;
	}
	while(q != NULL)
	{
		cout << q->data <<"  ";
		q = q->next;
	}
}
int main()
{
	//LNode *La = createList();
	//LNode *Lb = createList();

	//sort(La);
	//sort(Lb);

	//erase(La);
	//erase(Lb);

while(1)
	{
		LNode *La = createList();
		LNode *Lb = createList();

		sort(La);
		sort(Lb);

		erase(La);
		erase(Lb);

		int choice;
		cout << "——————————————————————" << endl;
		cout << endl;
		cout << "	请输入对应数字以执行操作:" << endl;
		cout << "	  1.执行AB取并集操作" << endl;
		cout << "	  2.执行AB取交集操作" << endl;
		cout << "	  3.执行AB作差操作" << endl;
		cout << endl;
		cout << "——————————————————————" << endl;
		cin >> choice;
		
		switch(choice)
		{
		case 1:
			BingJi(La,Lb);

			system("pause");
			getchar();
			system("cls");
			break;
		case 2:
			JiaoJi(La,Lb);

			system("pause");
			getchar();
			system("cls");
			break;
		case 3:
			ChaJi(La,Lb);

			system("pause");
			getchar();
			system("cls");
			break;
		}
	}
}
/*
测试内容:
1.两个链表均为空
2.其中一个链表为空
3.两个链表都为重复内容且内容相同
4.其中一个链表为重复内容另一个链表为空
5.其中一个链表为重复内容但另一个链表正常
*/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值