广义表-----C语言

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


typedef enum {atom, list} NodeTag;  //atom = 0, 表示原子; list = 1, 表示子表
typedef char DataType;


typedef struct GLNode {
    NodeTag tag;   //区分原子结点和表结点
    union {
        DataType data;   //存放原子结点值
        struct GLNode *slink;   //指向子表的指针
    };
    struct GLNode *link;   //指向下一个结点
}GLNode, *Glist;   //广义表类型


GLNode *p;


//建立广义表
Glist CreatGList(Glist GL)
{
    char ch;
    scanf("%c", &ch);
    if(ch != ' ') {
        GL = (GLNode *)malloc(sizeof(GLNode));
        if(ch == '(') {
            GL->tag = list;
            GL->slink = CreatGList(GL->slink);   //递归调用构造子表
           }
        else {    //构造原子结点
            GL->tag = atom;
            GL->data = ch;
        }
    }
    else
        GL = NULL;
    scanf("%c", &ch);
    if(GL != NULL)
        if(ch == ',')
            GL->link = CreatGList(GL->link);    //递归构造后续广义表
        else
            GL->link = NULL;   //表示遇到')'时,无后续表
        return GL;
}


//输出广义表
void PrintGList(Glist GL)
{
    if(GL != NULL) {
        if(GL->tag == list) {
            printf("(");
            if(GL->slink == NULL)
                printf(" ");
            else
                PrintGList(GL->slink);   //递归调用输出子表
        }
        else
            printf("%c", GL->data);    //输出原子结点数据值
        if(GL->tag == list)
            printf(")");
        if(GL->link != NULL) {
            printf(",");
            PrintGList(GL->link);   //递归调用输出下一结点
        }
    }
}


//广义表的查找
void FindGlistX(Glist GL, DataType x, int *mark)
{
    if(GL != NULL) {
        if(GL->tag == 0 && GL->data == x) {
            p = GL;
            *mark = 1;
        }
        else
            if(GL->tag == 1)
                FindGlistX(GL->slink, x, mark);
            FindGlistX(GL->link, x, mark);
    }
}


//求广义表表头
Glist head(Glist GL)
{
    Glist p;
    if(GL != NULL && GL->tag != 0) {
        p = GL->slink;
        p->link = NULL;
        return p;
    }
    else
        return NULL;
}


//求广义表表尾
Glist tail(Glist GL)
{
    Glist p;
    if(GL != NULL && GL->tag != 0) {
        p = GL->slink;
        p = p->link;
    }
    return p;
}


//求广义表的深度
void depth(Glist GL, int *maxdh)
{
    int h;
    if(GL->tag == 0)
        *maxdh = 0;
    else
        if(GL->tag == 1 && GL->slink == NULL)
            *maxdh = 1;
    else {
        GL = GL->slink;
        *maxdh = 0;
        do {
            depth(GL, &h);
            if(h > *maxdh)
                *maxdh = h;
            GL = GL->link;
        }while(GL != NULL);
        *maxdh = *maxdh + 1;
    }
}


int main()
{
    Glist G;
    Glist s;
    DataType x;
    int mark = 0, maxdh;
    printf("Input:");
    G = CreatGList(G);
    printf("Print:");
    PrintGList(G);
    printf("\n");
    printf("Input Find x:");
    scanf("%c", &x);
    FindGlistX(G, x, &mark);
    if(mark) {
         printf("Find Yes\n");
         printf("%c\n", p->data);
    }
    else
        printf("Find No\n");
    s = head(G);
    PrintGList(s);
    printf("\n");
    s = tail(G);
    PrintGList(s);
    depth(G, &maxdh);
    printf("Depth:%d", maxdh);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值