在以单链表表示的正整数的有序集合上,实现集合的并、交和差运算

/*在以单链表表示的正整数的有序集合上,实现集合的并、交和差运算。
基本要求:
    (1)用单链表存储集合中的数据;
    (2)对单链表中的数据进行排序。
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*LinkList;

void CreateLinkList(LinkList &L,int n){//尾插法建立单向链表,头结点不用

	LinkList cur,pNew;
	int i;
		
	srand(time(0));
	
	L=cur=NULL;

	for(i=0;i<=n;i++){
		pNew=(LinkList)malloc(sizeof(LNode));
		pNew->data=rand()%90+10;				//产生出随机数作为集合内元素
		
		if(i==0){
			L=cur=pNew;
			L->data=-1;
		}
		else{
			cur->next=pNew;
			cur=pNew;
		}
	}
	cur->next=NULL;

}

int QuickSort(LinkList &L,LinkList tail){   //单链表递归快速排序
	LinkList mid,p,q,m;
	int key;
	
	if (L->next==tail || L->next->next==tail)
		return -1;

	mid=L->next;
	p=L;
	q=mid;
	key=mid->data;
	m=mid->next;
	
	while (m!=tail){
		if (m->data<key)
			p=p->next=m;
		else
			q=q->next=m;
		m=m->next;
	}

	p->next = mid;
	q->next = tail;

	QuickSort(L,mid);
	QuickSort(mid,tail);

	return 0;
}

void Print(LinkList L){//  输出集合
	LinkList p;

	p=L->next;;
	while(p){
		printf("%d\t",p->data);
		p=p->next;
	}
	printf("\n");
}

void AddList(LinkList La,LinkList Lb){    //求并集并输出
	LinkList Lc;
	LinkList cur,la,lb,ln;

	Lc=cur=(LinkList)malloc(sizeof(LNode));
	la=La->next;
	lb=Lb->next;

	while(la && lb){
		if(la->data<lb->data){
			ln=(LinkList)malloc(sizeof(LNode));
			ln->data=la->data;
			cur->next=ln;
			cur=ln;
			la=la->next;
		}
		else if(la->data==lb->data){
			ln=(LinkList)malloc(sizeof(LNode));
			ln->data=la->data;
			cur->next=ln;
			cur=ln;
			la=la->next;
			lb=lb->next;
		}
		else{
			ln=(LinkList)malloc(sizeof(LNode));
			ln->data=lb->data;
			cur->next=ln;
			cur=ln;
			lb=lb->next;
		}
	}
	while(la){
		ln=(LinkList)malloc(sizeof(LNode));
		ln->data=la->data;
		cur->next=ln;
		cur=ln;
		la=la->next;
	}
	while(lb){
		ln=(LinkList)malloc(sizeof(LNode));
		ln->data=lb->data;
		cur->next=ln;
		cur=ln;
		lb=lb->next;
	}
	cur->next=NULL;
	
	Print(Lc);
}

void JiaoList(LinkList La,LinkList Lb){
	LinkList Lc,la,lb,ln,cur;

	Lc=cur=(LinkList)malloc(sizeof(LNode));
	la=La->next;
	lb=Lb->next;
	while(la && lb){
		if(la->data<lb->data)
			la=la->next;
		else if(la->data==lb->data){
			ln=(LinkList)malloc(sizeof(LNode));
			ln->data=la->data;
			cur->next=ln;
			cur=ln;
			la=la->next;
			lb=lb->next;
		}
		else
			lb=lb->next;
	}
		cur->next=NULL;
		Print(Lc);
}

void ChaList(LinkList La,LinkList Lb){
	LinkList Lc,la,lb,cur,ln;

	Lc=cur=(LinkList)malloc(sizeof(LNode));
	la=La->next;
	lb=Lb->next;
	
	while(la && lb){
		if(la->data<lb->data){
			ln=(LinkList)malloc(sizeof(LNode));
			ln->data=la->data;
			cur->next=ln;
			cur=ln;
			la=la->next;
		}
		else if(la->data==lb->data){
			la=la->next;
			lb=lb->next;
		}
		else
			lb=lb->next;
	}
	while(la){
		ln=(LinkList)malloc(sizeof(LNode));
		ln->data=la->data;
		cur->next=ln;
		cur=ln;
		la=la->next;
	}
	cur->next=NULL;
	Print(Lc);
}

int main(){
	LinkList La,Lb;
	int na,nb;

	printf("请输入第一个集合的元素数目\n");
	scanf("%d",&na);
	CreateLinkList(La,na);

	printf("请输入第二个集合的元素数目\n");
	scanf("%d",&nb);
	CreateLinkList(Lb,nb);

	QuickSort(La,NULL);
	QuickSort(Lb,NULL);
	Print(La);
	Print(Lb);

	printf("并集为:\n");
	AddList(La,Lb);

	printf("交集为:\n");
	JiaoList(La,Lb);

	printf("差集为:\n");
	ChaList(La,Lb);

	return 0;
}

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用Python语言实现集合交、并、差运算的示例代码,其中假设链表中的元素为整数: ```python class Node: def __init__(self, val=None, next=None): self.val = val self.next = next class Set: def __init__(self): self.head = None # 在集合中添加元素 def add(self, val): if not self.contains(val): new_node = Node(val) new_node.next = self.head self.head = new_node # 判断集合中是否包含某个元素 def contains(self, val): curr = self.head while curr: if curr.val == val: return True curr = curr.next return False # 集合的交运算 def intersection(self, other): result = Set() curr = self.head while curr: if other.contains(curr.val): result.add(curr.val) curr = curr.next return result # 集合的并运算 def union(self, other): result = Set() curr = self.head while curr: result.add(curr.val) curr = curr.next curr = other.head while curr: result.add(curr.val) curr = curr.next return result # 集合的差运算 def difference(self, other): result = Set() curr = self.head while curr: if not other.contains(curr.val): result.add(curr.val) curr = curr.next return result ``` 使用示例: ```python # 创建两个集合 set1 = Set() set2 = Set() # 添加元素 set1.add(1) set1.add(2) set1.add(3) set2.add(3) set2.add(4) set2.add(5) # 集合的交运算 result = set1.intersection(set2) curr = result.head while curr: print(curr.val) curr = curr.next # 输出:3 # 集合的并运算 result = set1.union(set2) curr = result.head while curr: print(curr.val) curr = curr.next # 输出:1 2 3 4 5 # 集合的差运算 result = set1.difference(set2) curr = result.head while curr: print(curr.val) curr = curr.next # 输出:1 2 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值