大家帮忙看看啦、

weixiaoshashou 2009-05-18 07:57:53
#include<iostream>
#include<malloc.h>
using namespace std;
typedef struct node
{
int tag;//如果为1就为子表,0就为元素
union
{
char data;
struct node *sublist;//子表指针
}val;
struct node *link;//后继指针
}GLnode;
GLnode *CreatGL(char*s)//创建广义表
{
GLnode *h;char ch;//用一个广义表形式的字串参数S
h=NULL;
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(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 main()
{
char *L="((q,c,d),a,b,c,(d,e))";//这里只输出((q,c,d))??????????????问题来了
GLnode *H;
H=CreatGL(L);
DispGL(H);
system("pause");
}能帮我改一下算法么?急急急急急急急急

...全文
82 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
TADICAN 2009-05-19
  • 打赏
  • 举报
回复
#include "stdafx.h"

#include <iostream>
#include <malloc.h>
using namespace std;
typedef struct node
{
int tag;//如果为1就为子表,0就为元素
union
{
char data;
struct node *sublist;//子表指针
}val;
struct node *link;//后继指针
}GLnode;
GLnode *CreatGL(char**s)//创建广义表
{
GLnode *h;char ch;//用一个广义表形式的字串参数S
h=NULL;
ch=**s;//取扫描字符
(*s)++;//串指针下移一位
if(ch!='\0')
{
h=(GLnode *)malloc(sizeof(GLnode));//创建新节点
if(ch=='(')//当为左括号
{
h->tag=1;
h->val.sublist=CreatGL(s);//递归构造子表并链接到表头结点
}
else if(ch==')')//当为空子表时
{
free(h);//小心内存泄漏
h=NULL;
return h;//这里应该直接返回,其它地方没什么问题
}
else
{
h->tag=0;
h->val.data=ch;
}
}
else {//串结束,子表为空
h=NULL;
}
ch=**s;//取下个扫描字符
(*s)++;//指针后移
if(h!='\0')//串未结束判断
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 <<")"; //not necessary
}
else
DispGL(g->val.sublist);
}
else
cout <<g->val.data;
if(g->tag==1)
cout <<")";
if(g->link!=NULL)
{
cout <<",";
DispGL(g->link);
}
}
}
int main()
{
char *L="((q,c,d),a,b,c,(),(d,e))";//这里只输出((q,c,d))??????????????问题来了
GLnode *H;
H=CreatGL(&L);
DispGL(H);
system("pause");
return 0;
}
weixiaoshashou 2009-05-18
  • 打赏
  • 举报
回复
太谢谢你了,我就结贴。
TADICAN 2009-05-18
  • 打赏
  • 举报
回复
忘记说了。
如果你不是用vs,请去掉#include "stdafx.h"
TADICAN 2009-05-18
  • 打赏
  • 举报
回复
看了一下,你的游标移动有问题。
修改了一下,输出正常了。
代码如下:
// algorithm.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <malloc.h>
using namespace std;
typedef struct node
{
int tag;//如果为1就为子表,0就为元素
union
{
char data;
struct node *sublist;//子表指针
}val;
struct node *link;//后继指针
}GLnode;
GLnode *CreatGL(char**s)//创建广义表 //这里
{
GLnode *h;char ch;//用一个广义表形式的字串参数S
h=NULL;
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(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 main()
{
char *L="((q,c,d),a,b,c,(d,e))";//
GLnode *H;
H=CreatGL(&L); //这里
DispGL(H);
system("pause");
return 0;
}

wangganggggmqj 2009-05-18
  • 打赏
  • 举报
回复
干什么的?还没看就头痛。

64,646

社区成员

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

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