データ構造--広義表

13752 ワード


 
コード:
 #include<string.h>
 #include<ctype.h>
 #include<malloc.h> 
 #include<limits.h> 
 #include<stdio.h> 
 #include<stdlib.h> 
 #include<io.h> 
 #include<math.h> 
 #include<process.h> //exit() 
 #define TRUE 1
 #define FALSE 0
 #define OK 1
 #define ERROR 0
 #define INFEASIBLE -1
 typedef char AtomType; //           
 typedef int Status; //Status      ,           , OK  
  /*          */
 typedef struct
 {
   char *ch; //     ,         ,  ch NULL 
   int length; //    
 }HString;
 /*               */
 typedef enum{ATOM,LIST}ElemTag; //ATOM==0:  ,LIST==1:   
 typedef struct GLNode
 {
   ElemTag tag;  //    ,            
   union         //             
   {
     AtomType atom;  //       ,AtomType       
     struct GLNode *hp;  //        
   }a;
   struct GLNode *tp; //        next,         
 }*GList,GLNode;  //     GList          
 //1.    
 Status StrAssign(HString *T,char *chars)
 { 
   int i,j;
   if((*T).ch)
     free((*T).ch); 
   i=strlen(chars); 
   if(!i)
   { 
     (*T).ch=NULL;
     (*T).length=0;
   }
   else
   { //chars     0 
     (*T).ch=(char*)malloc(i*sizeof(char));
     if(!(*T).ch) //        
       exit(OVERFLOW);
     for(j=0;j<i;j++) //    
       (*T).ch[j]=chars[j];
     (*T).length=i;
   }
   return OK;
 }
 //2.    :  S    T
 Status StrCopy(HString *T,HString S)
 {  
   int i;
   if((*T).ch)
     free((*T).ch); 
   (*T).ch=(char*)malloc(S.length*sizeof(char)); 
   if(!(*T).ch) 
     exit(OVERFLOW);
   for(i=0;i<S.length;i++) 
     (*T).ch[i]=S.ch[i];
   (*T).length=S.length;
   return OK;
 }
 //3.        : S   ,   TRUE,    FALSE
 Status StrEmpty(HString S)
 {  
   if(S.length==0&&S.ch==NULL)
     return TRUE;
   else
     return FALSE;
 }
 //4.     : S>T,    >0; S=T,    =0; S<T,    <0
 int StrCompare(HString S,HString T)
 {  
   int i;
   for(i=0;i<S.length&&i<T.length;++i)
     if(S.ch[i]!=T.ch[i])
       return S.ch[i]-T.ch[i];
   return S.length-T.length;
 }
 //5.    :  S     ,      
 int StrLength(HString S)
 {  
   return S.length;
 }
 //6.    : S    
 Status ClearString(HString *S)
 {  
   if((*S).ch)
   {
     free((*S).ch);
     (*S).ch=NULL;
   }
   (*S).length=0;
   return OK;
 }
 //7.    : Sub   S  pos       len   
 Status SubString(HString *Sub, HString S,int pos,int len)
 { //  ,1≤pos≤StrLength(S) 0≤len≤StrLength(S)-pos+1 
   int i;
   if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
     return ERROR;
   if((*Sub).ch)
     free((*Sub).ch); //      
   if(!len) //    
   {
     (*Sub).ch=NULL;
     (*Sub).length=0;
   }
   else
   { //     
     (*Sub).ch=(char*)malloc(len*sizeof(char));
     if(!(*Sub).ch)
       exit(OVERFLOW);
     for(i=0;i<=len-1;i++)
       (*Sub).ch[i]=S.ch[pos-1+i];
     (*Sub).length=len;
   }
   return OK;
 }
 //8.     :   (    )   T
 void InitString(HString *T)
 {  
   (*T).length=0;
   (*T).ch=NULL;
 }
 //9.    :    str      :hstr    ','     ,str      
 Status sever(HString *str,HString *hstr) 
 {  
   int n,i=1,k=0; //k            
   HString ch,c1,c2,c3;
   InitString(&ch); //   HString      
   InitString(&c1);
   InitString(&c2);
   InitString(&c3);
   StrAssign(&c1,",");  //       
   StrAssign(&c2,"(");
   StrAssign(&c3,")");
   n=StrLength(*str);  //       
   do
   {
     SubString(&ch,*str,i,1); //   
     if(!StrCompare(ch,c2))  //        
       ++k;
     else if(!StrCompare(ch,c3))  //        
       --k;
     ++i;
   }while(i<=n&&StrCompare(ch,c1)||k!=0); //        
   if(i<=n)
   {
     StrCopy(&ch,*str);  //       
     SubString(hstr,ch,1,i-2); //   
     SubString(str,ch,i,n-i+1); //   
   }
   else
   {
     StrCopy(hstr,*str);  //       
     ClearString(str);  //   str
   }
   return OK;
 }
 //10.        L
 Status InitGList(GList *L)
 {  
   *L=NULL;
   return OK;
 }
 //11.   S     L:     S          
 Status CreateGList(GList *L,HString S)
 {  
   HString emp,sub,hsub;
   GList p;
   InitString(&emp); //   HString     
   InitString(&sub);
   InitString(&hsub);
   StrAssign(&emp,"()"); //       , emp="()" 
   *L=(GList)malloc(sizeof(GLNode));
   if(!*L) //        
     exit(OVERFLOW);
   if(!StrCompare(S,emp)) //           S emp      ,      
   {
     (*L)->tag=LIST;
     (*L)->a.hp=NULL;
     (*L)->tp=NULL;
   }
   else if(StrLength(S)==1) // S    1,          
   {
     (*L)->tag=ATOM;
     (*L)->a.atom=S.ch[0];
     (*L)->tp=NULL;
   }
   else //      
   {
     (*L)->tag=LIST;
     (*L)->tp=NULL;
     SubString(&sub,S,2,StrLength(S)-2); //      
     sever(&sub,&hsub); // sub       hsub 
     CreateGList(&(*L)->a.hp,hsub); //       L
     p=(*L)->a.hp;
     while(!StrEmpty(sub)) //  StrEmpty          。  ,    n    
     {
       sever(&sub,&hsub); // sub       hsub 
       CreateGList(&p->tp,hsub);  
       p=p->tp;
     }
   }
   return OK;
 }
 //12.      L
 void DestroyGList(GList *L)
 {  
   GList ph,pt;
   if(*L) //L     
   { // ph pt  L      
     if((*L)->tag) //    
       ph=(*L)->a.hp;
     else //    
       ph=NULL;
     pt=(*L)->tp;
     free(*L); //  L     
     *L=NULL; // L   
     DestroyGList(&ph); //     ph 
     DestroyGList(&pt); //     pt 
   }
 }
 //13.      :    L       T
 Status CopyGList(GList *T,GList L)
 {  
   if(!L) //L  
   {
     *T=NULL;
     return OK;
   }
   *T=(GList)malloc(sizeof(GLNode));
   if(!*T)
     exit(OVERFLOW);
   (*T)->tag=L->tag; //       
   if(L->tag==ATOM) //        
     (*T)->a.atom=L->a.atom; //      
   else
     CopyGList(&(*T)->a.hp,L->a.hp); //       ,     
   if(L->tp==NULL) //    
     (*T)->tp=L->tp;
   else
     CopyGList(&(*T)->tp,L->tp); //     
   return OK;
 }
 //14.     L   ,     
 int GListLength(GList L)
 {  
   int len=0;
   GList p;
   if(L->tag==LIST&&!L->a.hp) //   
     return 0; //    0 
   else if(L->tag==ATOM) //     
     return 1;
   else //    
   {
     p=L->a.hp;
     do
     {
       len++;
       p=p->tp;
     }while(p);
     return len;
   }
 }
 //15.     L   
 int GListDepth(GList L)
 {  
   int max,dep;
   GList pp;
   if(L==NULL||L->tag==LIST&&!L->a.hp)
     return 1; //     1 
   else if(L->tag==ATOM)
     return 0; //       0 
   else //        
     for(max=0,pp=L->a.hp;pp;pp=pp->tp)
     {
       dep=GListDepth(pp); //    pp          
       if(dep>max)
         max=dep;
     }
   return max+1; //                  1 
 }
 //16.     L  
 GList GetHead(GList L)
 {  
   GList h;
   InitGList(&h);                             //       h
   if ( !L || L->tag==LIST && !L->a.hp)           //  L   
   {
     printf ( "
!"); // exit ( 0); // , } h=(GList)malloc(sizeof(GLNode)); // h if ( !h) // , exit ( OVERFLOW); h->tag=L->a.hp->tag; // h->tp=NULL; if ( h->tag==ATOM) // h->a.atom=L->a.hp->a.atom; else // CopyGList(&h->a.hp,L->a.hp->a.hp); return h; // } //17. L GList GetTail(GList L) { GList T; // T if ( !L) // L { printf ( "
!"); // exit ( 0); // } T=(GList)malloc(sizeof(GLNode)); // T if ( !T) // , exit ( OVERFLOW); T->tag=LIST; // , T->tp=NULL; CopyGList(&T->a.hp,L->a.hp->tp); // T return T; // } //18. L void Traverse_GL(GList L,void(*v)(AtomType)) { GList hp; if(L) //L { if(L->tag==ATOM) //L { v(L->a.atom); hp=NULL; } else //L hp=L->a.hp; Traverse_GL(hp,v); // Traverse_GL(L->tp,v); } } //19. , Traverse_GL void visit(AtomType e) { printf("%c ", e); } //20. void main( ) { char p[80]; int i; GList l,m; HString t; InitString(&t); // HString InitGList(&l); // InitGList(&m); do { printf ( "
***************************************
"); printf ( "\t :
"); printf ( "\t1、 L
"); printf ( "\t2、 L
"); printf ( "\t3、 L
"); printf ( "\t4、 L
"); printf ( "\t5、 L M
"); printf ( "\t6、 M
"); printf ( "\t7、 M
"); printf ( "\t8、 M
"); printf ( "\t9、 L ,
"); printf ( "\t10、 L ,
"); printf ( "\t0、
"); printf ( "***************************************
"); do { printf ( " (0-10):"); scanf ( "%d",&i); getchar ( ); }while ( i<0||i>10); switch(i){ case 1: printf(" L【 (a,(b),b))】:"); gets(p); StrAssign(&t,p); printf(" L :%s
",t); CreateGList(&l,t); // t l break; case 2: printf ( " L =%d
",GListLength(l)); // break; case 3: printf ( " L =%d
",GListDepth(l)); // break; case 4: printf ( " L:
"); Traverse_GL(l,visit); // , l printf ( "
"); break; case 5: CopyGList(&m,l); printf ( " L M, M :%s
",t); break; case 6: printf ( " M =%d
",GListLength(m)); // break; case 7: printf ( " M =%d
",GListDepth(m)); // break; case 8: printf ( " M:
"); Traverse_GL(m,visit); // , m printf ( "
"); break; case 9: DestroyGList(&m); // m m=GetHead(l); // l printf ( " L , :
"); Traverse_GL(m,visit); // m printf ( "
"); break; case 10: DestroyGList(&m); // m m=GetTail(l); // l printf ( "m L , :
"); Traverse_GL(m,visit); // m printf ( "
"); } }while ( i); printf ( "
"); DestroyGList(&m); // m system("PAUSE"); // }