列出一个集合的所有非空子集

整体思路
description:
我们先看一个例子
A={a, b ,c ,d}
非空子集有
{a}
     |-->{a, b ,c }-->{a, b ,c ,d}
{a, b}-->|
     |-->{a, b ,d}  
{a, c}-->{a, c ,d}
{a, d}

{b}
    
{b, c}-->{b ,c ,d}

{b, d}  

{c}
{c, d}

{d}
通过上面的例子你是不是发现一个规律,
子集{a}、{b}、{c}、{d}分别是空集与未添加到子集中元素{a, b, c, d}中的某一个组合成。
子集{a, b}、{a, c}、{a, d}分别是子集{a}与未添加到子集中元素{b, c, d}中的某一个组合成。
子集{a, b ,c }和{a, b ,c }分别是子集{a, b}与未添加到子集中元素{c, d}中的某一个组合成。

子集{a, b ,c ,d}分别是子集{a, b ,c}与未添加到子集中元素{d}中的某一个组合成。

下面是代码

#include <stdio.h>
#include <stdlib.h>


int count = 0;	//表示第几个子集

void print(char *str)
{	
	printf("%d: %s\n", ++count, str);
}

//start表示还未添加到子集中的元素的开始位置
//end表示集合最后一个元素的位置
//在子集中的元素
void sub_list(char *start, char *end, char *str)
{
	char *p = start;
	int len = strlen(str);
	while( p <= end )	//想自己中依次添加未放入子集中的元素,一次一个
	{
		str[len] = *p;  //子集中添加一个未放入子集的元素。
		str[len+1] = 0;
		print(str);
		p++;
		sub_list(p, end, str);//递归计算在本子集基础上的产生的子集。
		str[len] = 0;  
	}
}

int main()
{
	char sub[] = "abcdef";
	char str[255];
	memset(str, 0, 255*sizeof(char));
	printf(" collent {%s} : \n", sub);
	sub_list(sub, &sub[strlen(sub)-1], str );
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值