C语言【微项目07】—生成集合的全部子集[模拟python列表存储所有子集](采用0/1标记法--选中为1/未选中为0)【2021-11-18】

C语言【微项目07】—生成集合的全部子集[模拟python列表存储所有子集](采用0/1标记法--选中为1/未选中为0)【2021-11-18】

  • GenerateSubset.c
  • 运行结果示例
    • 1.元素个数为0
    • 2.元素个数为1
    • 3.元素个数为3
    • 4.元素个数为5
    • 5.元素个数为7

【TDTX】

GenerateSubset.c

#include 
#include 
#include 

typedef struct AList
{
     
	//定义一个列表类型结构,用不等长二维数组模拟列表类型结构 
	int m;//列表中子集的个数 
	int n;//所有子集中,最多元素的个数 
	int** alist;
	void (*InitAList)(struct AList* pls,int m,int n);
}AList;
void InitAList(struct AList* pls,int m,int n)
{
     
	pls->m = m;
	pls->n = n;
	pls->alist = (int**)malloc(sizeof(int*)*(pls->m));
	return;
}
void close(AList* pls)
{
     
	int i,j;
	for(i = 0;i < (pls->m);i++)
	{
     
		free((pls->alist)[i]);
	}
	free(pls->alist);
	return; 
}
void PutsList(int* list,int m,int n)
{
     
	int i,j;
	for(i = 0;i < m;i++)
	{
     
		for(j = 0;j < n;j++)
		{
     
			printf("%d ",*(list+i*n+j));
		}
		puts("");
	}
	return; 	
}
void PutsAList(AList ls)
{
     
	int i,j;
	for(i = 0;i < ls.m;i++)
	{
     
		//printf("alist[%d][0]=%d\n",i,alist[i][0]);
		printf("[");
		for(j = 1;j <= (ls.alist)[i][0];j++)
		{
     
			if(j == 1)
			{
     
				printf("%d",(ls.alist)[i][j]);
				continue;
			}
			printf(",%d",(ls.alist)[i][j]);
		}
		printf("]\n");
	}
	return; 
}
void getSymbolList(AList* pls,int* list)
{
     
	int tt;
	int co = 0;
	int i,j;
	for(i = 0;i < pls->m;i++)
	{
     
		for(co = 0,tt = i,j = pls->n-1;j >= 0;j--)
		{
     
			if(tt != 0)
			{
     
				(*(list+i*pls->n+j)) = tt % 2;
				tt = tt / 2;	
				if(*(list+i*pls->n+j) == 1)
				{
     
					co++;
				}
			}
			else
			{
     
				*(list+i*pls->n+j) = 0;
			}
		}
		(pls->alist)[i] = (int*)malloc(sizeof(int)*co+1);
		(pls->alist)[i][0] = co;
		//printf("alist[%d][0]=%d\n",i,alist[i][0]);
	}
	return; 
}
void getAList(AList* pls,int* list,int* A,void (*getSymbolList)(AList* pls,int* list))
{
     
	int i,j,k;
	getSymbolList(pls,list);
	for(i = 0;i < pls->m;i++)
	{
     
		for(k = 1,j = 0;j <pls->n;j++)
		{
     
			if(*(list+i*pls->n+j) == 1)
			{
     
				(pls->alist)[i][k++] = A[j];
			}
		}
	}
	return; 
}

int main()
{
     
	int n;
	puts("输入集合元素个数:");
	scanf("%d",&n);
	int A[n];//集合A,元素个数n,C99 
	for(int i = 0;i < n;i++)
	{
     
		scanf("%d",&A[i]);
	}

	int m = pow(2,n);
	int list[m][n];

	AList ls;
	ls.InitAList = InitAList;
	ls.InitAList(&ls,m,n);
	
	puts("\n生成【子集组合标记】与【全部子集】!");
	getAList(&ls,(int*)list,A,getSymbolList);

	puts("\n输出检查【子集组合标记】:");
	PutsList((int*)list,m,n);//输出二维【子集组合标记】数组list 
	 
	puts("\n输出检查【全部子集】:");
	PutsAList(ls);//输出生成【全部子集】,子集保存在列表ls中 
	
	close(&ls);//关闭列表ls,释放ls.InitAList(&ls,m,n)所分配的列表空间 

	return 0;
}

运行结果示例

1.元素个数为0

C语言【微项目07】—生成集合的全部子集[模拟python列表存储所有子集](采用0/1标记法--选中为1/未选中为0)【2021-11-18】_第1张图片

2.元素个数为1

C语言【微项目07】—生成集合的全部子集[模拟python列表存储所有子集](采用0/1标记法--选中为1/未选中为0)【2021-11-18】_第2张图片

3.元素个数为3

C语言【微项目07】—生成集合的全部子集[模拟python列表存储所有子集](采用0/1标记法--选中为1/未选中为0)【2021-11-18】_第3张图片

4.元素个数为5

C语言【微项目07】—生成集合的全部子集[模拟python列表存储所有子集](采用0/1标记法--选中为1/未选中为0)【2021-11-18】_第4张图片
C语言【微项目07】—生成集合的全部子集[模拟python列表存储所有子集](采用0/1标记法--选中为1/未选中为0)【2021-11-18】_第5张图片

5.元素个数为7

C语言【微项目07】—生成集合的全部子集[模拟python列表存储所有子集](采用0/1标记法--选中为1/未选中为0)【2021-11-18】_第6张图片
C语言【微项目07】—生成集合的全部子集[模拟python列表存储所有子集](采用0/1标记法--选中为1/未选中为0)【2021-11-18】_第7张图片
C语言【微项目07】—生成集合的全部子集[模拟python列表存储所有子集](采用0/1标记法--选中为1/未选中为0)【2021-11-18】_第8张图片
C语言【微项目07】—生成集合的全部子集[模拟python列表存储所有子集](采用0/1标记法--选中为1/未选中为0)【2021-11-18】_第9张图片
C语言【微项目07】—生成集合的全部子集[模拟python列表存储所有子集](采用0/1标记法--选中为1/未选中为0)【2021-11-18】_第10张图片


------------------------------------------------------第七次发项目类文章有点激动啊!-----------------------------------------------------
-----------------------------------------------------【C语言—微项目—自编练习】------------------------------------------------------
----------------------------------------------------------------【TDTX】-----------------------------------------------------------------

你可能感兴趣的:(C语言【微项目】,c语言,集合,生成子集,0/1背包,列表)