C语言实现两个集合合并及有序集合的并集(顺序存储、链式存储)

这篇具有很好参考价值的文章主要介绍了C语言实现两个集合合并及有序集合的并集(顺序存储、链式存储)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、两个集合并集问题

  • 获取LA、LB的表长m、n。
  • 从LB中第一个数据元素开始,循环n次执行:从LB中查找第i(1≤i≤n)个数据元素赋值给e;然后在LA中查找元素e,如果不存在,则将e插入在表LA的最后。

2、算法描述

status MergeList(List &LA,List LB)
{
	m = ListLength(LA);
	n = ListLength(LB);
	for(i=0; i<n; i++)
	{
		GetElem(LB,i,e); //取LB中的第i个元素赋值给e 
		if(!LocateElem(LA,e)) //判断LA有无e元素 
			ListInsert(LA,++m,e); //不存在则将e插入LA中 
	}
}

3、顺序存储实现

#include <stdio.h>

#define MAXSIZE 100

typedef struct
{
	int *elem;
	int length;
 } Sqlist;
 
int i,j;

int InitList(Sqlist &L)
{//初始化顺序表 
	L.elem = new int[MAXSIZE];
	if(!L.elem) return 0;
	L.length = 0;
	return 1;
}

int CreateList(Sqlist &L,int n)
{//创建顺序表 
	if(n>MAXSIZE || n<1) return 0;
	printf("enter %d elem:\n",n);
	for(i=0;i<n;i++)
	{
		int e;
		scanf("%d",&e);
		L.elem[i]=e;
		L.length++;
	}
	return 1;
}

int GetElem(Sqlist L,int i,int &e)
{//按位置查找元素,用e返回值 
	if(i>L.length) return 0;
	e=L.elem[i-1];
	return 1;
}

int LocateElem(Sqlist L,int e)
{//元素e存在则返回1,否则返回0 
	for(i=0;i<L.length;i++)
	{
		if(L.elem[i] == e) return 1;
	}
	return 0;
}

int ListInsert(Sqlist &L,int n,int e)
{//在第n个位置插入元素e 
	if(n<0 || n>L.length+1) return 0;
	for(i=L.length-1;i>=n-1;i--)
	   L.elem[i+1] = L.elem[i];
	L.elem[n-1] = e;
	L.length++;
	return 1; 
}

int MergeList(Sqlist LA,Sqlist LB,Sqlist &LC)
{//顺序表合并 
	if(LA.length+LB.length > MAXSIZE) return 0;
	LC.elem=new int[LA.length+LB.length];
	int  *pa,*pb,*pc,*pa_last,*pb_last;
	pc=LC.elem;
	pa=LA.elem;
	pb=LB.elem;
	pa_last=LA.elem+LA.length-1;
	pb_last=LB.elem+LB.length-1;
	while(pa<=pa_last && pb<=pb_last)
	{
		if(*pa < *pb) 
		{
			*pc++ = *pa++;
			LC.length++;
		}
		else
		{ 
			*pc++ = *pb++;
			LC.length++;
		}
	}
	while(pa<=pa_last) 
	{
		*pc++ = *pa++;
		LC.length++;
	}
	while(pb<=pb_last)
	{
		*pc++ = *pb++;
		LC.length++;
	}
	return 1;
}

int main()
{
	Sqlist LA,LB,LC;
	InitList(LA);InitList(LB);InitList(LC);
	int a,b,e;
	printf("LA length= ");
	scanf("%d",&a);
	printf("LB length= ");	
	scanf("%d",&b);
	CreateList(LA,a);CreateList(LB,b);
	MergeList(LA,LB,LC);
	printf("Mergelist:");
	for(i=0;i<LC.length;i++)
	{
		printf("%d  ",LC.elem[i]);
	 }
	printf("\n");
	printf("Collection:");
	for(j=1;j<=b;j++)
	{
		GetElem(LB,j,e);
		if(!LocateElem(LA,e)) 
		   ListInsert(LA,++a,e);
    }
	for(i=0;i<LA.length;i++)
	{
		printf("%d  ",LA.elem[i]);
	 }
	 return 1; 
}

4、链式存储实现文章来源地址https://www.toymoban.com/news/detail-725655.html

#include <stdio.h>

typedef struct LNode
{
	int data;
	LNode *next;
 } LNode,*Linklist;
 
LNode *p;

int InitList(Linklist &L)
{//初始化列表 
	L = new LNode;
	L->next = NULL;
	return 1;
}

int CreatList_H(Linklist &L,int n)
{//用尾插法创建列表 
	int i;
	LNode *r; 
	printf("enter %d elem:",n);
	for(i=0;i<n;i++)
	{
		p = new LNode;
		scanf("%d",&p->data);
		p->next = r->next;
		r->next = p;
		r = p;
	}
	return 1;
}

int ListLengh(Linklist L)
{//求长度 
	int i=0;
	p = L->next;
	while(p){
		p = p->next;
		++i;
	} 
	return i;
}

int GetElem(Linklist L,int n,int &e)
{//按位置获取元素值,用e返回 
	p = L->next;
	int i=1;
	while(p && i<n)
	{
		p = p->next;
		i++;
	}
	if (!p || i>n)  return 0;
	e = p->data;
	return 1;
}

int LocateElem(Linklist L,int e)
{//存在元素e则返回1,否则返回0 
	p = L->next;
	while(p){
		if(p->data == e)  return 1;
		p = p->next;
	} 
	return 0;
}

void ListInsert(Linklist &L,int e)
{//用前插法插入元素e 
	p = new LNode;
	p->data = e;
	p->next = L->next;
	L->next = p; 
}

int MergeList(Linklist LA,Linklist LB,Linklist &LC)
{
	LNode *pa,*pb,*pc;
	pa=LA->next;
	pb=LB->next;
	pc=LC;
	while(pa && pb)
	{
		if(pa->data <= pb->data)
		{
			pc->next=pa;
			pa=pa->next;
		}
		else
		{
			pc->next=pb;
			pb=pb->next;
		}
	}
	pc->next=pa?pa:pc;
	return 1;
}

int main()
{
	Linklist LA,LB,LC;
	InitList(LA);InitList(LB);InitList(LC);
	int a,b;
	printf("LA length= ");
	scanf("%d",&a);
	printf("LB length= ");	
	scanf("%d",&b);
	CreatList_H(LA,a);CreatList_H(LB,b);
	MergeList(LA,LB,LC);
	int i,j,e;
	LNode *q=LC->next;
	printf("Mergelist:");
	while(q)
	{
		printf("%d ",q->data);
		q=q->next;
	}
	for(i=1;i<=b;i++)
	{
		GetElem(LB,i,e);
		if(!LocateElem(LA,e))  ListInsert(LA,e);
	}
	int n;
	n = ListLengh(LA);
	p = LA->next;
	printf("\ncollection:");
	for(j=0;j<n;j++)
	{
		printf("%d   ",p->data);
		p = p->next;
	}
	return 1;
}

到了这里,关于C语言实现两个集合合并及有序集合的并集(顺序存储、链式存储)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言 | Leetcode C语言题解之第21题合并两个有序链表

    题目: 题解:

    2024年04月12日
    浏览(30)
  • laravel 两个集合取交集、并集、差集

    交集: 使用intersect()函数,用于获取两个集合的交集: 并集:使用union()函数,用于获取两个集合的并集: 差集:使用diff()函数,用于获取两个集合的差集:

    2024年02月12日
    浏览(60)
  • 88. 合并两个有序数组、Leetcode的Python实现

    博客主页:🏆李歘歘的博客 🏆 🌺每天不定期分享一些包括但不限于计算机基础、算法、后端开发相关的知识点,以及职场小菜鸡的生活。🌺 💗点关注不迷路,总有一些📖知识点📖是你想要的💗 ⛽️今天的内容是     Leetcode  88. 合并两个有序数组        ⛽️💻💻💻

    2024年02月06日
    浏览(42)
  • Java使用不同方式获取两个集合List的交集、补集、并集(相加)、差集(相减)

    首先知道几个单词的意思: 并集 = union 交集 = intersection 补集 = complement 析取 = disjunction 减去 = subtract 对于两个给定集合A、B,由两个集合所有元素构成的集合,叫做A和B的并集。 记作:AUB 读作“A并B” 例:{3,5}U{2,3,4,6}= {2,3,4,5,6} 对于两个给定集合A、B,由属于A又属于B的所有元

    2024年01月22日
    浏览(35)
  • python实现+leetcode题+合并两个有序列表超详细流程图分析以及代码思路

    给你两个按非递减顺序排列的整数列表nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。 注意 :最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的初始长度为

    2023年04月09日
    浏览(41)
  • C语言-面试题实现有序序列合并

    要求: a.输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。 数据范围: 1≤n,m≤1000 1≤n,m≤1000 , 序列中的值满足 0≤val≤30000 输入描述: 1.输入包含三行, 2.第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行

    2024年02月06日
    浏览(43)
  • 21.合并两个有序链表

    一、思路 二、源码 创建一个新链表 两个链表比较,小于等于取下来尾插 循环结束条件为任意一个链表为空 最后将之剩下的链表直接尾插

    2024年01月23日
    浏览(32)
  • 合并两个有序链表

    题目链接 :力扣21,合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 首先我们能够想到的就是 遍历一遍数组,判断两个结点的大小,将数值小的结点放在前面,数值大的不断尾插在后面 。是不是听

    2023年04月27日
    浏览(34)
  • 21. 合并两个有序链表

     

    2024年02月12日
    浏览(24)
  • 合并两个有序数组(简单)

    给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 ,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意: 最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况

    2024年01月18日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包