噜啦噜啦噜呼呼呼 2023-10-20 23:48 采纳率: 66.3%
浏览 13
已结题

广义表的构造输出与销毁

构造广义表,输出广义表,销毁广义表


#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;
}

大家帮我看一下,代码哪里有问题,为什么输出不正确啊?

img

  • 写回答

1条回答 默认 最新

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月4日
  • 创建了问题 10月20日

悬赏问题

  • ¥15 用verilog实现tanh函数和softplus函数
  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题
  • ¥15 Utunbu中vscode下cern root工作台中写的程序root的头文件无法包含