集合合并(链表实现)

题目说明:

实现两个集合的并集AUB,
A={1,2,3,4,},B={5,3,1,6};
结果:{1,2,3,4,5,6}。

并集:相同部分取一次
 

代码解析:

1.建立A、B链表,将集合中的数据插入

2.合并两个链表,查找B中是否有与A相同元素,如不同插入到A链表中,最终得到的A链表极为最终结果

3.使用完后销毁A、B链表

代码实现:



typedef int ElemType;
typedef struct Node
{
	ElemType data;
	struct Node* next;
}Node,*List;

//初始化
void InitList(List plist)
{
	assert(plist != NULL);
	if (plist == NULL)
		return;
	plist->next = NULL;
}

//尾插
bool Insert_tail(List plist, int val)
{
	Node* p =(Node*)malloc(sizeof(Node));
	assert(plist != NULL);
	if (plist == NULL)
		return false;
	p->data = val;
	Node* q;
	for (q = plist; q->next != NULL; q = q->next)
		;
	p->next = q->next;
	q->next = p;
	return true;
}
//销毁链表
void Destroy(List plist)
{
	Node* p = plist->next;
	while (plist->next != NULL)
	{
		p = plist->next;
		plist->next = p->next;
		free(p);
	}
}
//输出链表中的值
void Show(List plist)
{
	Node* p;
	for (p = plist->next; p != NULL; p = p->next)
		printf("%-4d", p->data);
	printf("\n");
}
//求链表长度函数
int GetLength(List plist)
{
	int count = 0;
	for(Node* p = plist->next;p != NULL;p = p->next)
		count++;
	return count;
}

//获取pos下标的值
bool GetElem(List plist,int pos, ElemType* rtval)
{
	if (pos < 0 || pos >= GetLength(plist))
		return false;
	Node* p = plist->next;
	for (int i = 0; i < pos; i++, p = p->next)
		;
	*rtval = p->data;
	return true;
}

//查找函数
Node* Search(List plist, ElemType val)
{
	Node* p;
	for ( p = plist->next; p != NULL; p = p->next)
	{
		if (val == p->data)
			return p;
	}
	return NULL;
}

//合并函数
void Merge(List plistA, List plistB)
{
	int val;
	//遍历plistB
	for (int i = 0; i < GetLength(plistB); i++)
	{
		//获取plistB中i下标的值
		GetElem(plistB, i, &val);
		//不存在的时候插入
		if (Search(plistA, val) == NULL)
		{
			Insert_tail(plistA, val);
		}
	}
}
int main()
{
	Node headA;
	Node headB;
	InitList(&headA);
	InitList(&headB);
	//A集合插入数据
	Insert_tail(&headA, 1);
	Insert_tail(&headA, 2);
	Insert_tail(&headA, 3);
	Insert_tail(&headA, 4);
	//B集合插入数据
	Insert_tail(&headB, 5);
	Insert_tail(&headB, 3);
	Insert_tail(&headB, 1);
	Insert_tail(&headB, 6);
	//打印一下,验证A\B内是否正确插入数据
	Show(&headA);
	Show(&headB);
	//打印合并后的值
	Merge(&headA, &headB);
	Show(&headA);
	//用完就要销毁
	Destroy(&headA);
	Destroy(&headB);
}

运行结果:

第一行:A集合

第二行:B集合

第三行:输出的新集合

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值