我采用了有序线性表的方式列出集合A={x|x∈Z,1≤x≤n}的r元子集。这个程序已经在windows xp环境下win_tc1.9.1平台调式成功。源程序如下:
#include<stdio.h>
/* 列出集合A={x|x∈Z,1≤x≤n}的r元子集 */
/* 数组value作为一个临时堆栈,用于暂存集合A的一个r元有序子集 */int setSub(int value[],int n,int r)
{
int i=0; /* 循环变量 */
int top; /* 堆栈指针 */
int index=0; /*统计r元有序子集的个数*/if(n>=r) /* 只有n≥r时,才有非空集r元有凶蛹?*/
{
for(i=0;i<r;i++)
value[i]=i+1; /* 将r元的第一个有序子集暂存于value堆栈中 */
top=i-1;
while(value[0]<=n-r+1) /* r元有序子集的第一个元数不能大于全集中第n-r+1个元数 */
{
if(value[top]<=n-r+top+1)/* r元有序子集的每一个元数不能大于全集中第n-r+top+1个元数 */
{
index++; /* 统计r元有序子集的个数 */
printf("{"); /* 输出r元的有序子集 */
for(i=0;i<r;i++)
printf("%d,",value[i]);
printf("/b}/n");
value[top]++;
}
else
{
top--;
if(value[top]<=n-r+top+1)
{
value[top]++;
for(i=top+1;i<r;i++)
value[i]=value[i-1]+1;
top=i-1;
}
}/*if */
}/*while*/
}/*if*/
else
{
printf("{}");
index=1;
}
return index;
}void main()
{
int value[7],n=6,r=7,total;
printf("------------------------------------/n");
total=setSub(value,n,r);
printf("/n------------------------------------/n");
printf("/ntotal:%d",total);
getch();}