// 求幂集.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
using namespace std;
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//初始化
LinkList ListInit()
{
LNode *base=(LinkList)malloc(sizeof(LNode));
base->data=0;
base->next=NULL;
return base;
}
int ListInsert(LinkList L,int i,ElemType e)
{
LNode *p,*s;
int j=0;
p=(LNode *)L;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p || j>i-1) return ERROR;
s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
//删除一个节点
int ListDelete(LinkList &L,int i,ElemType &e)
{
LinkList p=L,q;
int j=0;
while(p->next && j<i-1)
{
p=p->next;
++j;
}
if(!(p->next) || j>i-1)
return ERROR;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
}
//长度
int ListLength(LinkList L)
{
LinkList p=L;
int j=0;
if(!L)
return ERROR;
while(p->next)
{
p=p->next;
++j;
}
return j;
}
//查找一个元素
int GetElem(LinkList L,int i,ElemType &e)
{
LNode *p=L;
int j=0;
while(p->next && j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
return ERROR;
e=p->data;
return OK;
}
//输出链表元素
void Display(LinkList L)
{
LNode *p=L;
if(!(p->next))
{
printf("NULL,");
return;
}
else
{
p=p->next;
while(p)
{
cout<<p->data;
p=p->next;
}
}
}
//求幂集
void PowerSet(int i,LinkList A,LinkList &B)
{
int k=0;
ElemType e=0;
if(i>ListLength(A))
{
Display(B);
cout<<endl;
}
else
{
GetElem(A,i,e);
k=ListLength(B);
ListInsert(B,k+1,e);
PowerSet(i+1,A,B);
ListDelete(B,k+1,e);
PowerSet(i+1,A,B);
}
}
int main(int argc, char* argv[])
{
LinkList list=ListInit();//初始化
LinkList list2=ListInit();//初始化
ListInsert(list,1,1);//插入元素
ListInsert(list,1,2);
ListInsert(list,1,3);
Display(list);//输出元素
cout<<"幂集是"<<endl;
PowerSet(1,list,list2);//求幂集
return 0;
}