噜啦噜啦噜呼呼呼 2023-10-20 23:48 采纳率: 70.7%
浏览 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 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?
  • ¥15 win10权限管理,限制普通用户使用删除功能
  • ¥15 minnio内存占用过大,内存没被回收(Windows环境)
  • ¥65 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?
  • ¥15 网络通信安全解决方案
  • ¥50 yalmip+Gurobi