简单C程序的编写18:并集算法

编写:A=A U B的并集算法。

思路:

1、用其中一个集合中的每一个元素与另一个集合比较:如果出现一样的情况,就删除一个集合中这个元素。

2、根据比较后得到的两个集合,让它们连接起来。

代码

#include <stdio.h>

void move(char *p,int n)  //删除相同元素函数
{
	while(p[n+1]!='\0')
	{
		p[n]=p[n+1];
		n++;
	}
	p[n]='\0';
}

void main()
{
	char a[100];
	char b[100];
	int i=0,j=0;

	printf("please input a:");
	gets(a);
	printf("please input b:");
	gets(b);

	while(b[i]!='\0')
	{
		while(a[j]!='\0')
		{
			if(a[j]==b[i])  //比较是否出现一样的元素
				move(a,j);
			else j++;
		}
		j=0;
		i++;
	}
	
	i=0;j=0;
	while(a[i]!='\0')  //判断A集合的长度
		i++;
	while(b[j]!='\0')  //连接两个集合
		a[i++]=b[j++];
	a[i]='\0';
	printf("please input a U b:");
	puts(a);
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是代码实现: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 typedef struct { int data[MAX_SIZE]; int length; } Set; // 初始化集合 void init(Set *s) { s->length = 0; } // 添加元素到集合 void add(Set *s, int num) { s->data[s->length++] = num; } // 检查元素是否在集合中 int contains(Set *s, int num) { for (int i = 0; i < s->length; i++) { if (s->data[i] == num) { return 1; } } return 0; } // 求交集 Set intersection(Set *s1, Set *s2) { Set result; init(&result); for (int i = 0; i < s1->length; i++) { if (contains(s2, s1->data[i])) { add(&result, s1->data[i]); } } return result; } // 求并集 Set unionSet(Set *s1, Set *s2) { Set result; init(&result); for (int i = 0; i < s1->length; i++) { add(&result, s1->data[i]); } for (int i = 0; i < s2->length; i++) { if (!contains(&result, s2->data[i])) { add(&result, s2->data[i]); } } return result; } // 打印集合 void printSet(Set *s) { printf("{ "); for (int i = 0; i < s->length; i++) { printf("%d ", s->data[i]); } printf("}\n"); } int main() { Set s1, s2, result; int choice; init(&s1); init(&s2); while (1) { printf("请选择操作:\n"); printf("1. 添加元素到集合1\n"); printf("2. 添加元素到集合2\n"); printf("3. 求两个集合的交集\n"); printf("4. 求两个集合的并集\n"); printf("5. 退出程序\n"); scanf("%d", &choice); switch (choice) { case 1: printf("请输入要添加的元素:\n"); int num1; scanf("%d", &num1); add(&s1, num1); printf("添加成功!\n"); break; case 2: printf("请输入要添加的元素:\n"); int num2; scanf("%d", &num2); add(&s2, num2); printf("添加成功!\n"); break; case 3: result = intersection(&s1, &s2); printf("集合1和集合2的交集为:"); printSet(&result); break; case 4: result = unionSet(&s1, &s2); printf("集合1和集合2的并集为:"); printSet(&result); break; case 5: printf("程序已退出。\n"); exit(0); default: printf("无效输入,请重新输入。\n"); break; } } return 0; } ``` 该程序采用了数组作为数据结构,通过 add 函数来添加元素到集合中,contains 函数来检查元素是否在集合中,intersection 函数来求两个集合的交集,unionSet 函数来求两个集合的并集,printSet 函数来打印集合。 对于时间复杂度,添加元素到集合的时间复杂度为 O(1),求交集和并集的时间复杂度为 O(n^2),其中 n 为集合的元素个数。对于空间复杂度,集合的大小最大为 MAX_SIZE,因此空间复杂度为 O(MAX_SIZE)。 为了优化时间复杂度,可以使用哈希表来实现集合,从而将 contains 函数的时间复杂度降为 O(1),求交集和并集的时间复杂度降为 O(n)。但是这样会增加空间复杂度,因为哈希表需要额外的空间来存储。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值