构造广义表,输出广义表,销毁广义表
#include<malloc.h>
#include<stdio.h>
typedef char ElemType;
typedef struct lnode
{
int tag; //结点标识类型
union
{
ElemType data; //存放原子值
struct lnode *sublist; //指向子表的指针
}val;
struct lnode *link; //指向下一个元素
}GLNode;
GLNode *CreateGL(char *&s) //构建广义表的链式存储结构 s为指向字符串的结点
{
GLNode *g;
char ch=*s++;
if(ch!='\0')
{
g=(GLNode *)malloc(sizeof(GLNode)); //如果第一个字符不为空,就代表起码会有一个字符,所以为节点申请空间
if(ch=='(') //如果为(,就是新广义表的开始
{
g->tag=1;
g->val.sublist=CreateGL(s); //子表的头结点就是(后边的数据
}
else if(ch==')')
g=NULL; //如果是),将表置为空
else if(ch=='#')
g=NULL; //(#)表示空表
else
{
g->tag=0;
g->val.data=ch;
}
}
else
g=NULL; //传入的为空,将广义表置为空
ch=*s++; //继续处理后边的字符
if(g!=NULL)
{
if(ch==',')
g->link=CreateGL(s);
else
g->link=NULL;
}
return g;
}
void DispGL(GLNode *g) //输出广义表 g为广义表的头结点
{
if(g!=NULL)
{
if(g->tag==0)
printf("%s",g->val.data);
else
{
printf("(");
if(g->val.sublist==NULL)
printf("#");
else
DispGL(g->val.sublist);
printf(")");
}
if(g->link!=NULL) //处理其兄弟结点
{
printf(",");
DispGL(g->link);
}
}
}
void fun(GLNode *gl) //销毁广义表
{
if(gl!=NULL)
{
if(gl->tag==1) //当为子表时,递归处理子表
fun(gl->val.sublist);
else //为原子时,直接销毁
free(gl);
gl=gl->link; //处理兄弟
}
}
int main()
{
char a[50]="(a,b,c)";
char *s;
s=a;
GLNode *g;
g=CreateGL(s);
printf("构造的广义表为:");
DispGL(g);
printf("销毁的广义表为:");
fun(g);
DispGL(g);
return 0;
}
大家帮我看一下,代码哪里有问题,为什么输出不正确啊?