数据结构复习代码——递归实现广义表的创建以及遍历

1、递归实现广义表的创建以及遍历

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>

#define AtomType int

typedef enum{HEAD,ATOM,CHILDLIST}ElemType;

typedef struct GLNode
{
    ElemType tag;
    union{
        AtomType atom;
        struct GLNode *hp;
    };
    struct GLNode *tp;
}GLNode;

typedef GLNode *GenList;

void InitGenList(GenList &gl)
{
    gl = NULL;
}

bool sever(char *sub,char *hsub)
{
    //printf("%s \n %s \n",sub,hsub);
    if(*sub == '\0' || strcmp(sub,"()")==0)                 //空串或者第一个元素为空表
    {
        hsub[0] = '\0';
        return true;
    }
    int n = strlen(sub);                                    //获取截取后的字符串的长度
    int i = 0;
    char ch  = sub[0];
    int k = 0;
    while(i<n && (ch!=','|| k != 0))                        //截取首节点并进行分割
    {
        if(ch == '(')
        {
            k++;
        }else if(ch == ')')
        {
            k--;
        }
        i++;
        ch = sub[i];
    }

    if(i < n)                                               //进行截取操作并进行尾节点的更新
    {
        sub[i] = '\0';
        strcpy(hsub,sub);
        strcpy(sub,sub+i+1);
    }else if(k != 0){                                       //字符串内括号不匹配输入错误
        return false;
    }else{
        strcpy(hsub,sub);
        sub[0] = '\0';
    }
    return true;
}

void CreateGenList(GenList &gl,char *str)
{
    int n = strlen(str);
    char *sub = (char*)malloc(sizeof(char) * (n-2));        //为截取字符串括号中间的内容分配空间
    char *hsub = (char*)malloc(sizeof(char) * (n-2));       //为截取表头元素分配内存空间
    assert(sub != NULL && hsub != NULL);

    strncpy(sub,str+1,n-2);                                 //截取操作
    sub[n-2] = '\0';                                        //设置截取后的字符串的结束字符
    //printf("%s",sub);
    if(gl == NULL)                                          //广义表为空时,申请头结点并返回
    {
        gl = (GLNode*)malloc(sizeof(GLNode));
        assert(gl != NULL);
        gl->tag = HEAD;
        gl->hp = gl->tp = NULL;
    }
    GLNode *p = gl;                                         //当广义表不为空时,保存表头节点
    while(strlen(sub) != 0)                                 //从截取的字符串中遍历
    {
        p = p->tp = (GLNode*)malloc(sizeof(GLNode));        //为新节点分配内存空间
        assert(p != NULL);
        p->hp = p->tp = NULL;                               //新结点的初始化
        //printf("%s",sub);
        if(sever(sub,hsub))                                 //截取头结点并判断的相关操作
        {
           // printf("%s",hsub);
            if(hsub[0] == '(')                              //当前节点为子表情况
            {
                p->tag = CHILDLIST;
                CreateGenList(p->hp,hsub);                  //递归操作----进行子表的创建
            }else{                                          //原子节点的相关操作
                p->tag = ATOM;
                p->atom = atoi(hsub);
            }

        }
    }
}

//实现对广义表的遍历
void ShowGenList(GenList &gl)
{
    GLNode *p = gl->tp;
    printf("(");
    while(p != NULL)
    {
        if(p->tag == ATOM)
        {
            printf("%d",p->atom);
            if(p->tp != NULL)
                printf(",");
             p = p->tp;
        }
        else if(p->tag == CHILDLIST)
        {
            ShowGenList(p->hp);
            if(p->tp != NULL)
            {
                printf(",");
            }
            p = p->tp;

        }
    }
    printf(")");
}

//判空
bool GenListEmpty(GenList &gl)
{
    return gl->hp==NULL;
}

int GenListLength(GenList &gl)
{
    int length = 0;
    GLNode *p = gl->tp;
    while(p != NULL)
    {
        length++;
        p=p->tp;
    }
    return length;
}


int GenListDepth(GenList &gl)
{
    if(gl->tp == NULL)
        return 1;
    GLNode *p = gl->tp;
    int maxdepth = 0;
    int dep;
    while(p != NULL)
    {
        if(p->tag == CHILDLIST)
        {
            dep = GenListDepth(p->hp->tp);
            if(dep > maxdepth)
            {
                maxdepth = dep;
            }
        }
        p = p->tp;
    }
    return maxdepth+1;
}
int main()
{
    GenList gl;
    InitGenList(gl);

    char *ga = "(1,2,3)";
    char *gb = "(1,(3,4))";
    char *gc = "(1,(2),3)";
    char *gd = "()";
    char *ge = "((1,2,3))";
    char *gf = "(1,(2,(3,4)),5)";

    CreateGenList(gl,gf);               //正确实现字符串的截取操作
    ShowGenList(gl);
    int length = GenListLength(gl);
    printf("\n%d" ,length);
    int depth = GenListDepth(gl);
    printf("\n%d" ,depth);
    return 0;
}

 

posted @ 2022-07-03 21:03  往心。  阅读(90)  评论(0编辑  收藏  举报