帮忙看看我的程序有没有问题,这是一个关于集合运算的链表实现。。
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <conio.h>
#include <string.h>
typedef struct Point{
char Data;
struct Point *Next;
};
typedef struct Collection{
char CollectionName;
int PointNumber;
struct Point *CollectionData;
};
void Show(struct Collection *C){
struct Point *p=C->CollectionData;
printf("\n CollectionName: %c",C->CollectionName);
printf("\n Number of Points: %d ",C->PointNumber);
while(p){
printf("-> %c",p->Data);
p=p->Next;}
printf("\n");
}
int CheckPoint(struct Collection *C, char ch){
struct Point *p=C->CollectionData;
while(p){
if(p->Data==ch)
return(1); /*exist*/
p=p->Next;
}
return(0); /*not exist*/
}
int AddPoint(struct Collection *C,struct Point *P){
if(CheckPoint(C,P->Data))
return (0);/*exist need not adding Point*/
P->Next=C->CollectionData;
C->CollectionData=P;
++C->PointNumber;
return (1) ;/*not exist needing adding */
}
void CAndC (struct Collection *CB, struct Collection *CA){
/*The result is in CB */
struct Point *Pb=CB->CollectionData;
while(Pb->Next){
if(CheckPoint(CA,Pb->Next->Data)==1)
Pb=Pb->Next;
else{
Pb->Next=Pb->Next->Next;
--CB->PointNumber;
}
}
if(CB-> CollectionData&&(CheckPoint(CA,CB->CollectionData->Data)==0)){
CB->CollectionData=CB->CollectionData->Next;
--CB->PointNumber;
}
}
void COrC(struct Collection *CA, struct Collection *CB){
/*destroy CB and the result is in CA*/
struct Point * Ps=NULL; while(CB->CollectionData){
Ps=CB->CollectionData;
CB->CollectionData= CB->CollectionData->Next;
if(AddPoint(CA,Ps))
++CA->PointNumber;
/*deal with the memory
else {
free(Ps->Data);
free(Ps->Next);
}
*/
--CB->PointNumber;
}
}
void CSubC(struct Collection *CA, struct Collection *CB){
/*the result is CA*/
struct Point *Pb=CA->CollectionData;
if(CB->CollectionData&&(CheckPoint(CA,CB->CollectionData->Data)==1)){
CB->CollectionData= CB->CollectionData->Next;
--CB->PointNumber;
}
while(Pb->Next){
if(CheckPoint(CA,Pb->Next->Data)==0)
Pb=Pb->Next;
else{
Pb->Next=Pb->Next->Next;
--CB->PointNumber;
}
}
if(CB->PointNumber==0)
CB->CollectionData=NULL;
}
void CreateCollection(struct Collection *A,char Name ,int Number)
{ A->CollectionName=Name;
A->PointNumber=Number;
A->CollectionData=NULL;
}
int CBelongC(struct Collection *CA,struct Collection *CB){
struct Point *Pb=CB->CollectionData;
while(Pb){
if(CheckPoint(CA,Pb->Data)==0)
return(0);
Pb=Pb->Next;}
return(1) ;
}
int PBelongC(struct Point *P,struct Collection *C){
return(CheckPoint(C,P->Data));
}
int PDeleteC( struct Point *P,struct Collection *C){
struct Collection *A=(struct Collection *)malloc(sizeof(struct Collection));
struct Point *pt=(struct Point *)malloc(sizeof(struct Point));
int i=0;
A->PointNumber=0;
pt->Next=NULL;
pt->Data=P->Data;
i=AddPoint(A,pt);
CSubC(C,A);
return(CheckPoint(C,P->Data));
}
void SortC(struct Collection *C){
char c;
struct Point *Pa,*Pb=C->CollectionData;
Pa=Pb;
while(Pa){
Pb=Pa;
while(Pb){
if(Pb->Data < Pa->Data){
c=Pa->Data;
Pa->Data=Pb->Data;
Pb->Data=c; }
Pb=Pb->Next;
}
Pa=Pa->Next;
}
}
void SCAndSC(struct Collection *CA,struct Collection *CB){、
/* S开头是有序 */
struct Point *Pa=CA->CollectionData;
struct Point *Pb=CB->CollectionData;
if(CA->CollectionData&&(CheckPoint(CB,CA->CollectionData->Data)==0)){
CA->CollectionData=CA->CollectionData->Next;
--CA->PointNumber;
}
while((Pa->Next!=NULL) ||(Pb!=NULL)) {
if(Pa->Next->Data==Pb->Data)
Pa=Pa->Next;
else {
Pa->Next=Pa->Next->Next;
--CA->PointNumber;
}
Pb=Pb->Next;
}
if(CA->PointNumber==0)
CA->CollectionData=NULL;
}
void SCOrSC(struct Collection *CA,struct Collection *CB){
struct Point *Pa=CA->CollectionData;
struct Point *Pb=CB->CollectionData;
}
main()
{ struct Collection *A, *B,*C;
int k,f,PointN;
int ICNB=0;
struct Point *p=NULL;
clrscr();
A=B=NULL;
A=(struct Collection *)malloc(sizeof(struct Collection));
printf("please input CollectionName:");
A->CollectionName=getche();
printf("\n CollectionName : %c ",A->CollectionName);
printf("\n PointNumber:");
scanf("%d",&ICNB);
printf("%d\n",ICNB);
A->PointNumber=ICNB;
A->CollectionData=NULL;
for (k=1;k<=ICNB;k++){
p=(struct Point *)malloc(sizeof(struct Point));
p->Next=NULL;
printf("\n input PointData : ");
p->Data=getche();
printf("\n time %d : \n",k);
if (AddPoint(A,p)==0) {
--k;
printf("\n the data exist!!!\n");}
}
Show(A);
B=A;
A=(struct Collection *)malloc(sizeof(struct Collection));
printf("please input CollectionName:");
A->CollectionName=getche();
printf("\n CollectionName : %c ",A->CollectionName);
printf("\n PointNumber:");
scanf("%d",&ICNB);
A->PointNumber=ICNB;
A->CollectionData=NULL;
for (k=1;k<=ICNB;k++){
p=(struct Point *)malloc(sizeof(struct Point));
p->Next=NULL;
printf("\n input PointData : ");
p->Data=getche();
printf("\n time %d : \n",k);
if (AddPoint(A,p)==0) {
--k;
printf("\n the data exist!!!\n");}
}
Show(A);
/* SWAP A B */
C=A;
A=B;
B=C;
C=NULL;
SortC(A);
SortC(B);
Show(A);
Show(B);
CAndC(A,B);
k=CBelongC(A,B);
printf(" %d \n",k);
Show(A);
Show(B);
getch();
clrscr();
getch();
}