广义表留存 bug多多

#ifndef GLIST_H_INCLUDED
#define GLIST_H_INCLUDED


#include <string.h>


typedef char atomtype;


struct GLNode
{
    int tag;                //标签
    union                   //当前元素
    {
        atomtype elem;
        struct GLNode*hp;
    };
    struct GLNode*tp;       //next
};


typedef struct GLNode*  GList;


int depth(GList L)          //返回L的深度
{
    if(!L) return 0;
    if(L->tag==0) return depth(L->tp)+1;
    return depth(L->hp)>depth(L->tp)?depth(L->hp)+1:depth(L->tp)+1;
}


char *qkh(char c[])
{
    int len=strlen(c);
    c[len-1]='\0';
    return c+1;
}
void substring(char dst[],char src[],int from,int len)
{
    int i;
    for(i=0;i<len;i++) dst[i]=src[i+from-1];
    dst[i]='\0';
}


int devide(char **head,char **tail) //功能:将head分为头、尾。尾空则头去括号
{
    int cnt=0;
    int i;
    int find=0;
    for(i=0;(*head)[i];i++)
    {
        if((*head)[i]=='(') cnt++;
        if((*head)[i]==')') cnt--;
        if((*head)[i]==','&&cnt==0) break;
    }
    if((*head)[i]==',')//找到了逗号
    {
        find = 1;
        substring(*tail,*head,i+2,strlen(*head)-i-1);
        (*head)[i]='\0';
    }
    else                //没有逗号
    {
        *head=qkh(*head);
        *tail[0]='\0';
    }
    return find;


}
GList CreateGList(char *s)
{
    if(s==NULL||strlen(s)==0) {return NULL;}
    GList L=(GList)malloc(sizeof(struct GLNode));
    if(strlen(s)==1) {L->tag=0;L->elem=s[0];L->tp=NULL;return L;}


    char*head = (char*)malloc(20*sizeof(char));
    char*tail = (char*)malloc(20*sizeof(char));
    strcpy(head,s);
    tail[0]='\0';
    int find=devide(&head,&tail);


    if(find==0) {L->tag=1;L->hp=CreateGList(head);}
    else {L->tag=0;L->elem=head[0];}
    L->tp=CreateGList(tail);
    return L;
}




int Print(GList L,int flag)
{
    if(!L) return 0;
    if(L->tag==0)
    {
        if(flag==1) putchar('(');
        printf("%c",L->elem);
        if(L->tp) putchar(',');
        Print(L->tp,0);
        if(flag==1) putchar(')');


    }
    else
    {
        if(flag==1) printf("(");
        Print(L->hp,1);
        if(flag==1) printf(")");
        if(L->tp) putchar(',');
        Print(L->tp,0);


    }
    return 0;
}

#endif // GLIST_H_INCLUDED



测试文件


#include <stdio.h>
#include <stdlib.h>
#include "glist.h"


int main()
{
    char s[20];
    printf("input the Glist:\n");
    while(gets(s))
    {
        GList L=NULL;
        L=CreateGList(s);
        Print(L,0);


        printf("\ninput the Glist:\n");


    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值