设有链表 A 和B,其中的数据内容均为整型数值,且都按增序排列,生成新的链表 C、D,满足下列要求:(1)C=AUB(2)D=A-B

本文详细介绍了一种使用链表实现集合的并集和差集运算的方法。通过两个已排序的链表A和B,生成了包含A和B并集的链表C,以及仅在A中出现的元素组成的链表D。文章提供了完整的C语言代码实现,展示了如何创建链表、插入元素、打印链表,以及执行并集和差集运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设有链表 A 和B,其中的数据内容均为整型数值,且都按增序排列,生成新的链表 C、D,满足下列要求:(1)C=AUB(C 中元素为 A 和 B 的并集)(2)D=A-B (D 中元素为在 A 中出现但不在 B 中出现的元素)且 C、D 元素都按增序排列。

输入: 键盘输入链表 A 的数据元素(至少 5 个)键盘输入链表 B 的数据元素(至少 5 个)
输出:屏幕分别打印链表 A,B,C,D 的数据元素。

# include <stdio.h>
# include <stdlib.h>
typedef int ElemType;
typedef struct Node
{
	ElemType data;
	struct Node *next;
}LNode,  *LinkList;
void CreateList(LinkList &L,int n)//建立有n个元素的线性链表L
{
	LinkList p,s;
	int i;
	L=(LinkList)malloc(sizeof(LNode));
	L->next=NULL;
	p=L;
	if(n!=0)
		printf("请按赠序依次输入数据元素\n");
	for(i=0;i<n;i++)
	{
		s=(LinkList)malloc(sizeof(LNode));
		scanf("%d",&s->data);
		p->next=s;
		p=p->next;
	}
	p->next=NULL;
}
void ListPrint(LinkList L)//输出链表 
{
	LinkList p;
	int i;	
	p=L->next;
	if(!p) printf("ERROR!\n");
	for(i=0;p;i++)
	{
		printf("%d\t",i+1,p->data);
		p=p->next;
	}
}

void ListInsert(LinkList &L,int i,ElemType e)//在第i个位置插入元素e
{
	LinkList p,s;
	int j;
	p=L;
	for(j=0;p&&j<i-1;j++)
		p=p->next;
	if(!p||j>i-1) {printf("ERROR!\n"); return;}
	s=(LinkList)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;
}

void GetUnionSet(LinkList A,LinkList B,LinkList C)//求A、B并集C
{
	LinkList a,b;
	int i;
	a=A->next;
	b=B->next;
	for(i=0;a||b;i++)
	{
		if(a&&b)
		{
			if(a->data==b->data) 
			{
				b=b->next;
				i--;
			}
			else if(a->data<b->data)
			{	
				ListInsert(C,i+1,a->data);
				a=a->next;
			}
			else
			{
				ListInsert(C,i+1,b->data);
				b=b->next;
			}
			
		}
		else if(a)
		{
			ListInsert(C,i+1,a->data);
			a=a->next;
		}
		else
		{
			ListInsert(C,i+1,b->data);
			b=b->next;
		}
	}
}

void GetDiffElem(LinkList A,LinkList B,LinkList D)//获得线性链表D,D中元素为在A中出现但不在B中出现的元素
{
	LinkList a,b;
	int i=0;
	a=A->next;
	b=B->next;
	while(a)
	{
		if(a->data==b->data)
		{
			a=a->next;
			b=b->next;
		}
		else if(!b)
		{
			ListInsert(D,i+1,a->data);
			a=a->next;
			i++;
		}
		else if(a->data<b->data)
		{
			ListInsert(D,i+1,a->data);
			a=a->next;
			i++;
		}
		else b=b->next;
	}
}
int main()
{
	LinkList A,B,C,D;
	int n1,n2;
	printf("请输入A的数据元素个数n1:\n");
	scanf("%d",&n1);
	CreateList(A,n1);
	printf("请输入B的数据元素个数n2:\n");
	scanf("%d",&n2);
	CreateList(B,n2);
	CreateList(C,0);
	CreateList(D,0);
	GetUnionSet(A,B,C);
	GetDiffElem(A,B,D);
	printf("\n输出表A\n");
	ListPrint(A);
	printf("\n输出表B\n");
	ListPrint(B);
	printf("\n输出表C\n");
	ListPrint(C);
	printf("\n输出表D\n");
	ListPrint(D);
	printf("\n");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨尘儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值