广义表输出问题

lq651659889 2009-04-08 10:15:38
交谈中请勿轻信汇款、中奖信息,勿轻易拨打陌生电话。

菜鸟(739947307) 22:11:29
#include<iostream>
using namespace std;

typedef struct lnode
{
int tag;
union
{
char data;
struct lnode *sublist;
}val;
struct lnode *link;
}GLNode;

GLNode *CreatGL ( char *&s)
{
GLNode *h;
char ch;
ch=*s;
s++;
if ( ch != '\0' )
{
h= (GLNode *)malloc (sizeof (GLNode));
if ( ch == '(' )
{
h->tag = 1;
h->val.sublist = CreatGL (s);
}
else if ( ch == ')' )
h = NULL;
else
{
h->tag = 0;
h->val.data = ch;
}
}
else
h = NULL;
ch = *s;
s++;
if ( ch != '\0' )
if ( ch == ',' )
h->link = CreatGL (s);
else
h->link = NULL;
if ( h->link == NULL )
return h;
}

void DispGL ( GLNode *g)
{
if ( g != NULL)
{
if ( g->tag == 1)
{
cout<<"(";
if ( g->val.sublist == NULL )
cout<<" ";
else
DispGL ( g->val.sublist );
}
else
cout<<g->val.data;
if ( g->link != NULL)
{
cout<<",";
DispGL (g->link);
}
else
cout<<")";
}
}

int main (void)
{
char* t="(a,b,((c,d),e))";
GLNode* gl;
gl = CreatGL(t);
DispGL (gl);
return 0;
}
这里输出的结果咋的是(a,b,((c,d),e)),这里怎么多了个逗号啊!望高人指点谢谢
...全文
271 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ltc_mouse 2009-04-09
  • 打赏
  • 举报
回复
有几个地方有问题~

GLNode *CreatGL ( char *&s)
{
GLNode *h;
char ch;
ch=*s;
s++;
if ( ch != '\0' )
{
h= (GLNode *)malloc (sizeof (GLNode));
h->link = NULL; ///默认置空,避免野指针,更常用的是memset(h,0x00,sizeof(GLNode));
if ( ch == '(' )
{
h->tag = 1;
h->val.sublist = CreatGL (s);
}
else if ( ch == ')' )
{
free(h); ///free避免内存泄漏
h = NULL;
}
else
{
h->tag = 0;
h->val.data = ch;
}
}
else
h = NULL;
if(NULL == h) ///NULL直接返回
return h;
ch = *s;
s++;
if ( ch != '\0' )
if ( ch == ',' )
h->link = CreatGL (s);
else
h->link = NULL;
//if ( h->link == NULL )
// return h;
return h; ///都要返回,不需要判断h->link
}
liubuweiright 2009-04-09
  • 打赏
  • 举报
回复
up
xqls_xqls 2009-04-09
  • 打赏
  • 举报
回复
给你一个例子,,希望对你有帮助

#include "stdafx.h"

#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct lnode
{
int tag;
union{
char data;
struct lnode *sublist;
}val;
struct lnode *link;
}GLNode;

GLNode *CreatGl(char *&s) //创建广义表
{
GLNode *h;
char ch;
ch=*s;
s++;
if(ch!='\0')
{
h=(GLNode *)malloc(sizeof(GLNode));
if (ch=='(')
{
h->tag=1;
h->val.sublist=CreatGl(s);
ch=*s;
s++;
}
else if(ch==')')
h=NULL;
else
{
h->tag=0;
h->val.data=ch;
ch=*s;
s++;
}
}
else h=NULL;
if(h!=NULL)
if(ch==',')
h->link=CreatGl(s);
else
h->link=NULL;
return h;
}

void DispGL(GLNode *g) //输出
{
if(g!=NULL)
{
if(g->tag==1)
{
cout<<"(";
if(g->val.sublist==NULL)
cout<<" ";
else
DispGL(g->val.sublist);
}
else cout<<g->val.data;
if(g->tag==1)
cout<<")";
if(g->link!=NULL)
{
cout<<",";
DispGL(g->link);
}
}
}

int GLLength(GLNode *g) //求长度
{
int n=0;
g=g->val.sublist;
while (g!=NULL)
{
n++;
g=g->link;
}
return n;
}

int GLDepth(GLNode *g) //求深度
{
int max=0,dep;
if(g->tag==0)
return 0;
g=g->val.sublist;
if(g==NULL)
return 1;
while(g!=NULL)
{
if(g->tag==1)
{
dep=GLDepth(g);
if(dep>max)
max=dep;
}
g=g->link;
}
return (max+1);
}

GLNode *GLCopy(GLNode *p) //复制
{
GLNode *q;
if(p==NULL)
return NULL;
q=(GLNode *)malloc(sizeof(GLNode));
q->tag=p->tag;
if(p->tag==1)
q->val.sublist=GLCopy(p->val.sublist);
else
q->val.data=p->val.data;
q->link=GLCopy(p->link);
return q;
}

GLNode *head(GLNode *g) //求表头
{
GLNode *p=g->val.sublist;
GLNode *q,*t;
if(p==NULL)
{
cout<<"空表不能求表头"<<endl;
return NULL;
}
else if(g->tag==0)
{
cout<<"原子不能求表头"<<endl;
return NULL;
}
if(p->tag==0)
{
q=(GLNode *)malloc(sizeof(GLNode));
q->tag=0;
q->val.data=p->val.data;
q->link=NULL;
}
else
{
t=(GLNode *)malloc(sizeof(GLNode));
t->tag=1;
t->val.sublist=p->val.sublist;
t->link=NULL;
q=GLCopy(t);
free(t);
}
return q;
}

GLNode *tail(GLNode *g) //求表尾
{
GLNode *p=g->val.sublist;
GLNode *q,*t;
if(g==NULL)
{
cout<<"空表不能求表尾"<<endl;
return NULL;
}
else if(g->tag==0)
{
cout<<"原子不能求表尾"<<endl;
return NULL;
}
p=p->link;
t=(GLNode *)malloc(sizeof(GLNode));
t->tag=1;
t->link=NULL;
t->val.sublist=p;
q=GLCopy(t);
free(t);
return q;
}

GLNode *Append(GLNode *gh,GLNode *gt) //表头和表尾相连
{
gh->link=gt->val.sublist;
gt->val.sublist=gh;
return (gt);
}

void main()
{
GLNode *s,*q,*i,*p;
//char *h="(a,b,(a,b),((c)),i)";
//char *h="((w),a,b,(a,b),((c)))";
char *h="((),a,b,(a,b),((c)),i)";
//char *h="(((e,t),u),a,b,(a,b),((c)),i)";
s=CreatGl(h);
cout<<"广义表s为:";
DispGL(s);
cout<<endl;
cout<<"广义表s的长度为: "<<endl<<GLLength(s)<<endl;
cout<<"广义表s的深度为:"<<endl<<GLDepth(s)<<endl;
cout<<"将表s复制给q:"<<endl;
q=GLCopy(s);
DispGL(q);
cout<<endl;

cout<<"s的表头为 ";
DispGL(head(s));
cout<<endl;

cout<<"s的表尾为 ";
DispGL(tail(s));
cout<<endl;

char *m="((w),a,b,(a,b),((c)))";
char *b="(((e,t),u),a,b,(a,b),((c)),i)";
i = CreatGl(m);
p = CreatGl(b);
cout<<"\n广义表i为:";
DispGL(i);
cout<<endl;
cout<<"广义表p为:";
DispGL(p);
cout<<endl;
cout<<"广义表i+p为:";
DispGL(Append(i,p));
cout<<endl;
}
lq651659889 2009-04-09
  • 打赏
  • 举报
回复

if ( ch != '\0' )
{
h= (GLNode *)malloc (sizeof (GLNode));
h->link = NULL; ///默认置空,避免野指针,更常用的是memset(h,0x00,sizeof(GLNode));//这句的话这个if后的else应该就是这功能吧。
lq651659889 2009-04-09
  • 打赏
  • 举报
回复
按你的改了但是输出时还是有问题,输出是(a,b,((c,d),e)))多了个右括号啊!
ltc_mouse 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lq651659889 的回复:]
按你的改了但是输出时还是有问题,输出是(a,b,((c,d),e)))多了个右括号啊!
[/Quote]
输出问题,需要查DispGL函数了,你看看是不是这里的问题

void DispGL ( GLNode *g)
{
if ( g != NULL)
{
if ( g->tag == 1)
{
cout <<"(";
if ( g->val.sublist == NULL )
cout <<" ";
else
DispGL ( g->val.sublist );
cout <<")"; ///()中间的是sublist,所以sublist输出前加(,输出后应加)
}
else
cout <<g->val.data;
if ( g->link != NULL)
{
cout <<",";
DispGL (g->link);
}
//')'与link不是同一层次的,不应该在这里输出
//else
// cout << ")";
}
}

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧