广义表的递归数据结构的表示与实现--自己写数据结构

文件glist.h头文件如下

#ifndef _GLIST_H_
#define _GLIST_H_

typedef enum {ATOM,LIST}ElemTag;

typedef struct _GList
{
    ElemTag tag;

    union
    {
        char data;
        struct _GList *sublist;
    }val;
    struct _GList *next;
}GList,*pGList;

int glist_length(pGList pgl);
int glist_depth(pGList pgl);
pGList creat_glist(char **ch);
void printf_glist(pGList pgl);
#endif

数据结构实现glist.c如下

/************************
时间:2014.12.15
作者:XIAO_PING_PING
编译环境:DEV-C++ 4.9.9.2
内容:广义表的递归表示与实现
功能:学习写数据结构
*************************/
#include <string.h>
#include <stdlib.h>

#include "glist.h"

/*广义表的长度*/
int glist_length(pGList pgl)
{
    int length = 0;

    pgl = pgl->val.sublist;

    while(pgl)
    {
        length++;
        pgl = pgl->next;
    }

    return length;
}

/*广义表的深度*/
int glist_depth(pGList pgl)
{
    int max = 0,depth;

    if(0 == pgl->tag)
    {
        return 0;
    }

    pgl = pgl->val.sublist;
    if(!pgl)
    {
        return 1;
    }

    while(pgl)
    {
        if(pgl->tag)
        {
            depth = glist_depth(pgl);
            if(depth > max)
            {
                max = depth;
            }
        }
        pgl = pgl->next;
    }

    return max+1;
} 

/*创建广义表*/
pGList creat_glist(char **ch)
{
    pGList pgl;

    if(NULL == ch)
    {
        return ;
    }  

    char tch = *(*ch);
    *ch = *ch + 1;

    if('\0' != tch)
    {
        pgl = (GList *)malloc(sizeof(GList));
        if('(' == tch)
        {
            pgl->tag = LIST;
            pgl->val.sublist = creat_glist(ch);
        }
        else if(')' == tch)
        {
            pgl = NULL;
        }
        else
        {
            pgl->tag = ATOM;
            pgl->val.data = tch;
        }
    }
    else
    {
        pgl = NULL;
    }

    tch = *(*ch);
    *ch = *ch + 1;
    if(pgl)
    {
        if(',' == tch)
        {
            pgl->next = creat_glist(ch);
        }
        else
        {
            pgl->next =  NULL;
        }
    }

    return pgl;
}
/*遍历打印广义表*/
void printf_glist(pGList pgl)
{
    if(pgl)
    {
        if(1 == pgl->tag)
        {
            printf("(");
            if(pgl->val.sublist)
            {
                printf_glist(pgl->val.sublist);
            }
            else
            {
                printf(" ");
            }
        }
        else
        {
            printf("%c",pgl->val.data);
        } 

        if(1 == pgl->tag)
        {
            printf(")");
        }

        if(pgl->next)
        {
            printf(",");
            printf_glist(pgl->next);
        }
    }
}

测试文件test.c如下:

/***************************************
时间:2014.12.15
作者:XIAO_PING_PING
****************************************/
#include <conio.h>
#include <stdlib.h>
#include <string.h>

#include "glist.h"

int main()
{
    int length,depth;
    char *s="(a,(b,c,d),(d,l),d,p))";
    pGList gl; 

    gl = creat_glist(&s);
    length = glist_length(gl);
    depth = glist_depth(gl);
    printf("length = %d,depth = %d\n",length,depth);
    printf_glist(gl);

    getch();
    return 0;
}

运行结果如下:

时间: 2024-08-11 03:28:23

广义表的递归数据结构的表示与实现--自己写数据结构的相关文章

广义表的递归实现

广义表的定义 广义表是非线性的结构,是线性表的一种扩展,是有n个元素组成有限序列. 广义表的定义是递归的,因为在表的描述中又得到了表,允许表中有表. 例如 <1> A = () <2> B = (a,b) <3> C = (a,b,(c,d)) <4> D = (a,b,(c,d),(e,(f),h)) <5> E = (((),()) 广义表的节点结构定义: enum Type { HEAD,//头结点 VALUE,//数据 SUB,//子表

数组和广义表-第5章-《数据结构题集》答案解析-严蔚敏吴伟民版

习题集解析部分 第5章 数组和广义表 ——<数据结构题集>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑       本习题文档的存放目录:数据结构\▼配套习题解析\▼05 数组和广义表       文档中源码的存放目录:数据结构\▼配

数据结构4(数组和广义表)

第4章  数组和广义表 [例4-1]二维数组A的每一个元素是由6个字符组成的串,其行下标i=0,1,…,8,列下标j=1,2,…,10.若A以行为主序存储元素,A[8][5]的物理地址与当A按列为主序存储时的元素(  )的物理地址相同.设每个字符占一个字节. A.A[8][5]    B.A[3][10]    C.A[5][8]    D.A[0][9] //作图 解:  二维数A是一个9行10列的矩阵,即A[9][10].按行存储时,A[8][5]是第85个元素存储的元素.而按列存储时,第8

广义表的基本操作实现

广义表的四个特征:(1)广义线性表:(2)元素复合性:(3)元素递归性:(4)元素共享性 广义表的上述四个特征对于他的使用价值和应用效果起到了很大的作用.广义表的结构相当灵活,它可以兼容线性表.数组.树和有向图等各种常用的数据结构.当二维数组的每行或每列作为子表处理时,二维数组就是一个广义表:如果限制广义表中元素的共享和递归,广义表和树对应:如果限制广义表的递归并允许数据共享,则广义表和图对应. 广义表的基本操作有:(1)创建一个广义表(我以头尾链表作为存储结构):(2)取表头:(3)取表尾:(

广义表的有关知识点

概念: 广义表(Lists,又称列表)是一种非线性的数据结构,是线性表的一种推广.即广义表中放松对表元素的原子限制,容许它们具有其自身结构.它被广泛的应用于人工智能等领域的表处理语言LISP语言中.在LISP语言中,广义表是一种最基本的数据结构,就连LISP 语言的程序也表示为一系列的广义表. 定义: 广义表是n(n≥0)个元素a1,a2,…,ai,…,其中: ①ai--或者是原子或者是一个广义表. ②广义表通常记作:Ls=( a1,a2,…,ai,…,an). ③Ls是广义表的名字,n为它的长

数据结构与算法系列研究四——数组和广义表

稀疏矩阵的十字链表实现和转置 一.数组和广义表的定义 数组的定义1:一个 N 维数组是受 N 组线性关系约束的线性表.           二维数组的逻辑结构可形式地描述为:           2_ARRAY(D,R)              其中 D={aij} | i=0,1,...,b1-1; j=0,1,...,b2-1;aij∈D0}              R={Row,Col}              Row={<aij,ai,j+1>|0<=i<=b1-1;

33. 蛤蟆的数据结构笔记之三十三广义表实现二

33. 蛤蟆的数据结构笔记之三十三广义表实现二 本篇名言:" 希望是附丽于存在的,有存在,便有希望,有希望,便是光明.--鲁迅" 我们继续来看下广义表的其他代码实现.代码均来自网络,解释来自蛤蟆,均亲测可行. 欢迎转载,转载请标明出处: 1.  广义表实现二 1.1         main 创建两个链表的指针head和L. 输入一个字符串,调用GLCreate函数创建广义表.显示,获取头表,尾表,输出长度,深度,原子个数,复制列表,Merge列表,遍历,比较广义表操作. 如下图1:

javascript实现数据结构:广义表

原文:javascript实现数据结构:广义表  广义表是线性表的推广.广泛用于人工智能的表处理语言Lisp,把广义表作为基本的数据结构. 广义表一般记作: LS = (a1, a2, ..., an) LS是广义表的名称,n是它的长度,ai可以是单个元素,也可以是广义表,分别称为广义表LS的原子和子表.习惯上,用大写字母表示广义表的名称,小写字母表示原子.当广义表LS非空时,称第一个元素a1为LS的表头,称其余元素组成的表(a2, a3, ..., an)是LS的表尾. 下面列举一些广义表的例

数据结构算法C语言实现(十九)--- 5.5&amp;5.6&amp;5.7广义表

一.简述 传说Lisp的基本数据结构就是广义表,广义表也是具有典型递归属性的数据结构,此外,由于建表要处理字符串,用C语言处理起来也是一脸懵逼.....最后自己还想写一个将广义表还原成字符串的函数,一是使其可视化,而是验证算法5.6.花了不少功夫才写出来(强烈建议自己动手写一写),最后是借助树形结构的角度才找到一个不错的解决办法.按照<数据结构编程实验>的分类,数据结构无非线性结构.树状结构.图结构,可以说树是特殊的图(图的最小生成树),线性表示特殊的树.....扯远了! 二.头文件 补充版字