#ifndef GLIST_H_INCLUDED
#define GLIST_H_INCLUDED
#include <string.h>
typedef char atomtype;
struct GLNode
{
int tag; //标签
union //当前元素
{
atomtype elem;
struct GLNode*hp;
};
struct GLNode*tp; //next
};
typedef struct GLNode* GList;
int depth(GList L) //返回L的深度
{
if(!L) return 0;
if(L->tag==0) return depth(L->tp)+1;
return depth(L->hp)>depth(L->tp)?depth(L->hp)+1:depth(L->tp)+1;
}
char *qkh(char c[])
{
int len=strlen(c);
c[len-1]='\0';
return c+1;
}
void substring(char dst[],char src[],int from,int len)
{
int i;
for(i=0;i<len;i++) dst[i]=src[i+from-1];
dst[i]='\0';
}
int devide(char **head,char **tail) //功能:将head分为头、尾。尾空则头去括号
{
int cnt=0;
int i;
int find=0;
for(i=0;(*head)[i];i++)
{
if((*head)[i]=='(') cnt++;
if((*head)[i]==')') cnt--;
if((*head)[i]==','&&cnt==0) break;
}
if((*head)[i]==',')//找到了逗号
{
find = 1;
substring(*tail,*head,i+2,strlen(*head)-i-1);
(*head)[i]='\0';
}
else //没有逗号
{
*head=qkh(*head);
*tail[0]='\0';
}
return find;
}
GList CreateGList(char *s)
{
if(s==NULL||strlen(s)==0) {return NULL;}
GList L=(GList)malloc(sizeof(struct GLNode));
if(strlen(s)==1) {L->tag=0;L->elem=s[0];L->tp=NULL;return L;}
char*head = (char*)malloc(20*sizeof(char));
char*tail = (char*)malloc(20*sizeof(char));
strcpy(head,s);
tail[0]='\0';
int find=devide(&head,&tail);
if(find==0) {L->tag=1;L->hp=CreateGList(head);}
else {L->tag=0;L->elem=head[0];}
L->tp=CreateGList(tail);
return L;
}
int Print(GList L,int flag)
{
if(!L) return 0;
if(L->tag==0)
{
if(flag==1) putchar('(');
printf("%c",L->elem);
if(L->tp) putchar(',');
Print(L->tp,0);
if(flag==1) putchar(')');
}
else
{
if(flag==1) printf("(");
Print(L->hp,1);
if(flag==1) printf(")");
if(L->tp) putchar(',');
Print(L->tp,0);
}
return 0;
}
#define GLIST_H_INCLUDED
#include <string.h>
typedef char atomtype;
struct GLNode
{
int tag; //标签
union //当前元素
{
atomtype elem;
struct GLNode*hp;
};
struct GLNode*tp; //next
};
typedef struct GLNode* GList;
int depth(GList L) //返回L的深度
{
if(!L) return 0;
if(L->tag==0) return depth(L->tp)+1;
return depth(L->hp)>depth(L->tp)?depth(L->hp)+1:depth(L->tp)+1;
}
char *qkh(char c[])
{
int len=strlen(c);
c[len-1]='\0';
return c+1;
}
void substring(char dst[],char src[],int from,int len)
{
int i;
for(i=0;i<len;i++) dst[i]=src[i+from-1];
dst[i]='\0';
}
int devide(char **head,char **tail) //功能:将head分为头、尾。尾空则头去括号
{
int cnt=0;
int i;
int find=0;
for(i=0;(*head)[i];i++)
{
if((*head)[i]=='(') cnt++;
if((*head)[i]==')') cnt--;
if((*head)[i]==','&&cnt==0) break;
}
if((*head)[i]==',')//找到了逗号
{
find = 1;
substring(*tail,*head,i+2,strlen(*head)-i-1);
(*head)[i]='\0';
}
else //没有逗号
{
*head=qkh(*head);
*tail[0]='\0';
}
return find;
}
GList CreateGList(char *s)
{
if(s==NULL||strlen(s)==0) {return NULL;}
GList L=(GList)malloc(sizeof(struct GLNode));
if(strlen(s)==1) {L->tag=0;L->elem=s[0];L->tp=NULL;return L;}
char*head = (char*)malloc(20*sizeof(char));
char*tail = (char*)malloc(20*sizeof(char));
strcpy(head,s);
tail[0]='\0';
int find=devide(&head,&tail);
if(find==0) {L->tag=1;L->hp=CreateGList(head);}
else {L->tag=0;L->elem=head[0];}
L->tp=CreateGList(tail);
return L;
}
int Print(GList L,int flag)
{
if(!L) return 0;
if(L->tag==0)
{
if(flag==1) putchar('(');
printf("%c",L->elem);
if(L->tp) putchar(',');
Print(L->tp,0);
if(flag==1) putchar(')');
}
else
{
if(flag==1) printf("(");
Print(L->hp,1);
if(flag==1) printf(")");
if(L->tp) putchar(',');
Print(L->tp,0);
}
return 0;
}
#endif // GLIST_H_INCLUDED
测试文件
#include <stdio.h>
#include <stdlib.h>
#include "glist.h"
int main()
{
char s[20];
printf("input the Glist:\n");
while(gets(s))
{
GList L=NULL;
L=CreateGList(s);
Print(L,0);
printf("\ninput the Glist:\n");
}
return 0;
}