主题:自已写的求子集的程序
根据严蔚敏课本P149写的,
输入一个N值,求出N的所有子集,已经做出来了,但还有一个小错误,请帮忙看一眼吧。
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
typedef struct node{
ElemType data;
struct node *next;
}LinkList;
int ListInsert(LinkList *L,int n,ElemType &x){//含头结点
int i;
LinkList *p,*q,*r;
p=L;
for(i=1;i<=n&&p!=NULL;i++){
q=p;
p=p->next;
}
if(i<n) {printf("List INsert error\n");return 0;}
r=(LinkList *)malloc(sizeof(LinkList));
r->data=x;
if(p==NULL){
q->next=r;
r->next=NULL;
}
else {
q->next=r;
r->next=p;
}
return 1;
}
int ListDelete(LinkList *L,int n,ElemType &x){
int i;
LinkList *p,*q;
p=L;
for(i=1;i<=n&&p;i++){
q=p;
p=p->next;
}
if(p==NULL){
printf("Delete elem error p==NULL\n");
return 0;
}
if(p->next)
q->next=p->next;
else q->next=NULL;
x=p->data;
free(p);
return 1;
}
int GetElem(LinkList *L,int n,ElemType &x){
int i;
LinkList *p;
p=L;
for(i=1;i<=n&&p;i++)
p=p->next;
if(p==NULL) {
printf("n too large in GetElem");
return 0;
}
x=p->data;
return 1;
}
int ListLength(LinkList *L){//忽略头结点长度
int i=0;
LinkList *p;
p=L->next;
while(p!=NULL){
i++;
p=p->next;
}
return i;
}
int OutPut(LinkList *L){
LinkList *p;
p=L->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return 1;
}
void GetPowerSet(int i,LinkList *A,LinkList *B){
ElemType x;
int k;
if(i>ListLength(A)) OutPut(B);
else{
GetElem(A,i,x);
k=ListLength(B);
ListInsert(B,k+1,x);GetPowerSet(i+1,A,B);
ListDelete(B,k+1,x);GetPowerSet(i+1,A,B);
}
}
void main(){
LinkList *A,*B;
A=(LinkList *)malloc(sizeof(LinkList));A->next=NULL;
B=(LinkList *)malloc(sizeof(LinkList));B->next=NULL;
int n,j;
printf("含N个元素的集合的幂集 输入N\n");
scanf("%d",&n);
for(j=1;j<=n;j++)
ListInsert(A,j,j);
GetPowerSet(1,A,B);
}
输入一个N值,求出N的所有子集,已经做出来了,但还有一个小错误,请帮忙看一眼吧。
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
typedef struct node{
ElemType data;
struct node *next;
}LinkList;
int ListInsert(LinkList *L,int n,ElemType &x){//含头结点
int i;
LinkList *p,*q,*r;
p=L;
for(i=1;i<=n&&p!=NULL;i++){
q=p;
p=p->next;
}
if(i<n) {printf("List INsert error\n");return 0;}
r=(LinkList *)malloc(sizeof(LinkList));
r->data=x;
if(p==NULL){
q->next=r;
r->next=NULL;
}
else {
q->next=r;
r->next=p;
}
return 1;
}
int ListDelete(LinkList *L,int n,ElemType &x){
int i;
LinkList *p,*q;
p=L;
for(i=1;i<=n&&p;i++){
q=p;
p=p->next;
}
if(p==NULL){
printf("Delete elem error p==NULL\n");
return 0;
}
if(p->next)
q->next=p->next;
else q->next=NULL;
x=p->data;
free(p);
return 1;
}
int GetElem(LinkList *L,int n,ElemType &x){
int i;
LinkList *p;
p=L;
for(i=1;i<=n&&p;i++)
p=p->next;
if(p==NULL) {
printf("n too large in GetElem");
return 0;
}
x=p->data;
return 1;
}
int ListLength(LinkList *L){//忽略头结点长度
int i=0;
LinkList *p;
p=L->next;
while(p!=NULL){
i++;
p=p->next;
}
return i;
}
int OutPut(LinkList *L){
LinkList *p;
p=L->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return 1;
}
void GetPowerSet(int i,LinkList *A,LinkList *B){
ElemType x;
int k;
if(i>ListLength(A)) OutPut(B);
else{
GetElem(A,i,x);
k=ListLength(B);
ListInsert(B,k+1,x);GetPowerSet(i+1,A,B);
ListDelete(B,k+1,x);GetPowerSet(i+1,A,B);
}
}
void main(){
LinkList *A,*B;
A=(LinkList *)malloc(sizeof(LinkList));A->next=NULL;
B=(LinkList *)malloc(sizeof(LinkList));B->next=NULL;
int n,j;
printf("含N个元素的集合的幂集 输入N\n");
scanf("%d",&n);
for(j=1;j<=n;j++)
ListInsert(A,j,j);
GetPowerSet(1,A,B);
}