前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 大作业 题目四

C++ 大作业 题目四

原创
作者头像
HandSomeHe_In_Fzu
发布2022-12-01 17:31:42
3200
发布2022-12-01 17:31:42
举报
文章被收录于专栏:信道编码学习专栏

对于单链表,LinkList *L , LinkList *&L 和 LinkList &*L (不会使用)的区别,LinkList* L 用于 单纯的将传入指针L的指向地址赋予L1这个临时指针的指向地址。其并不会修改实参内部的变量值。

LinList *&L 相当于 linkList* &L,就是说,L就是传入指针的别名。对形参修改就是对实参修改。( 22-12-01 )

代码语言:javascript
复制
//题目四:要求利用带头结点的单链表,根据所提供的源代码,实现两个集合的并、交、差运算。
//【具体功能描述】
//1)要求用带头结点的单链表存储两个集合中的元素和最终的结果。
//2)集合的元素限定为十进制数,程序应对出现重复的数据进行过滤,即使得链表中没有重复数据。
//3)显示两个集合的内容及其并集、交集和差集的内容。
//4)要求不改变原来的集合,并集、交集和差集分别另外存放。
#include <iostream>
#include <string>
#include <malloc.h>
using namespace std;

struct Lnode {
	int data;
	struct Lnode* next;
};
typedef struct Lnode LinkList;
//struct Lnode LinkList;
void Disp(LinkList *Link) {
	LinkList *p = Link->next;
	//cout <<  "集合中的元素:" << endl;
	while (p!=NULL)
	{   
		cout  << p->data << " ";
		p= p->next;
	}
	cout << endl;
}


void DestroyList(LinkList *&Link) {
	LinkList *p ,*pre=Link;
	while (pre!=NULL)
	{
		p = pre->next;
		pre = NULL;
		delete pre;
		free(pre);

		pre = p;
		
	}
	Link = NULL;
}

LinkList* CreateListF() {   //创建链表
	LinkList* header,* a,* b,* c;
	int n;
	int data;
	cout << "创建一个链表,大小为:" << endl;
	cin >> n;
	header = (LinkList*)malloc(sizeof(LinkList));
	header->next = NULL;//首先先置空
	a = header;
	cout << "请对链表进行输入:" << endl;
	for (int i = 0, k=0; i < n; i++,k++) {
		int flag = 1;
		b = header->next;
		cin >> data;
		for (int j = 0; j < k; j++,b= b->next) {//如果当前输入的data与前面的链表内的数相同的话,舍去;反之创新节点
			if (data == b->data) {
				flag = 0;
				k--; //记录有多少个元素
				break;
			}
		}
		if (flag) {
			c = (LinkList*)malloc(sizeof(LinkList));
			c->data = data;
			a->next = c;
			a = c;
		}
	}
	a->next = NULL;
	return header;
}
LinkList* Combination(LinkList* &p,LinkList* &q) {  //简单合并
	LinkList  *a, *b,*Comb,*c,*d;
	Comb = (LinkList*)malloc(sizeof(LinkList));
	Comb->next = NULL;
	c = Comb;
	a = p;
	b = p->next;
	while (b!=NULL)
	{	
		d= (LinkList*)malloc(sizeof(LinkList));//
		a = b;
		d->data = a->data;//
		c->next = d; //
		c = d;//
		b = a->next;
	}
	
	c->next = q->next;

	//free(q);
	return Comb;
}
LinkList* Union(LinkList *&p) {   //并集
	LinkList *a = p->next, *b  , *c, *head , *d;
	//Disp(p);
	head  = (LinkList*)malloc(sizeof(LinkList));
	head->next = NULL;
	//int Len = getLength(p);
	d = head;
	while(a!=NULL) {
		int flag = 1;
		//cout << "调试:" << endl;
		//Disp(a);
		b = a->next;
		//Disp(b);
		while (b != NULL) {
			
			if (a->data == b->data) {
				flag = 0;
				//cout << b->data << "||";
			}
			if(flag==0) {
				//a = a->next;
				break;
			}
			b = b->next;
		}

			if (flag == 1) {
				c = (LinkList*)malloc(sizeof(LinkList));
				c->data = a->data ;
				d->next = c;
				d = c;
			}

			a = a->next;
	}
	d->next = NULL;
	return head;

}
void Subs(LinkList *L1, LinkList *L2, LinkList *&L3) {
	LinkList *a, *b, *c,*d;
	a = L1->next; 
	L3 = (LinkList *)malloc(sizeof(LinkList));
	L3->next = NULL;
	c = L3;
	while ( a!=NULL ) {
		int flag = 1;
		b = L2->next;
		while (b != NULL) {
			if (a->data == b->data) {
				flag = 0;
				//break;
			}
			if (flag == 0) {
				a = a->next;
				break;
			}
			b = b->next;

		}
		if (flag) {
			d = (LinkList *)malloc(sizeof(LinkList));
			d->data = a->data;
			c->next = d;
			c = d;
			a = a->next;
		}
		//cout << a->data;

	}
	c->next = NULL;

}

void InterSect(LinkList *L1, LinkList *L2, LinkList *&L3) {
	LinkList *a, *b, *c, *d;
	a = L1->next;
	L3 = (LinkList *)malloc(sizeof(LinkList));
	L3->next = NULL;
	c = L3;
	while (a != NULL) {
		b = L2->next;
		while (b != NULL) {
			if (a->data == b->data) {

				d = (LinkList *)malloc(sizeof(LinkList));
				d->data = a->data;
				c->next = d;
				c = d;
				a = a->next;
				break;
			}
			else {
				b = b->next;
			}
		}
		if (b == NULL)
			a = a->next;
		//cout << a->data;

	}
	c->next = NULL;

}

void Sort(LinkList *L1) {
	LinkList *a=L1->next, *b, *c;
	int temp = 0;
	while (a!=NULL)
	{
		b = a->next;
		while (b != NULL){
		if (a->data > b->data) {
			temp = a->data;
			a->data = b->data;
			b->data = temp;
		}
		b = b->next;
		}
		a = a->next;
	}
}


int getLength(LinkList *Link) {
	int Lenth = 0;
	LinkList *L = Link->next;
	while (L != NULL) {
		Lenth++;
		L = L->next;
	}
	return Lenth;
}

int main() {
	LinkList *ha,*ba,*ca,*da,*ea;
	ha = CreateListF();
	cout << "A集合:" << endl;
	Disp(ha);
	ba = CreateListF();
	cout << "B集合:" << endl;
	Disp(ba);
	cout << "A的有序集合:" << endl;
	Sort(ha);
	Disp(ha);
	cout << "B的有序集合:" << endl;
	Sort(ba);
	Disp(ba);
	cout << "A、B集合相加:" << endl;
	ca = Combination(ha, ba);
	Disp(ca);

	cout << "A、B集合的并:" << endl;
	da=Union(ca);
	Disp(da);

	//DestroyList(ca);
	
	cout << "A、B集合的差:" << endl;
	Subs(ha, ba, ca);
	Disp(ca);

	cout << "A、B集合的交集:" << endl;
	InterSect(ha, ba, ca);
	Disp(ca);
	
	//int Len = getLength(ca);
	//cout << "合并后的长度:" << Len << endl;
	DestroyList(ha);
	DestroyList(ba);
	DestroyList(ca);
	DestroyList(da);
	
	system("pause");
	return 0;
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档