广义表的实现

/*---------------------------------------------------------------------
        广义表的存储结构
---------------------------------------------------------------------*/
#include<stdio.h>
#include<stdlib.h>

typedef char ElemType;//元素类型是字符型

//广义表的存储结构
struct GNode
{
    int tag;    //标志域
    union{        //值域或子表的表头指针域
        ElemType data;
        struct GNode *sublist;
    };
    struct GNode *next;    //指向后继结点的指针域
};

/*----------------------函数声明----------------------*/
int LengthGList(struct GNode *GL);    //求广义表的长度
int DepthGList(struct GNode *GL);    //求广义表的深度
void CreateGList(struct GNode **GL);//建立广义表的存储结构
void PrintGList(struct GNode *GL);    //打印输出广义表
int SearchGList(struct GNode *GL, ElemType e);//查找等于给定字符的单元素结点,查找成功则返回1,否则返回0

/*----------------------主函数----------------------*/
void main()
{
    struct GNode *GL;//带表头附加结点
    printf("输入一个广义表,以分号结束\n");
    CreateGList(&GL);
    printf("输出广义表:");
    PrintGList(GL);
    printf("\n");
    printf("广义表的长度:");
    printf("%d\n", LengthGList(GL->sublist));
    printf("广义表的深度:");
    printf("%d\n", DepthGList(GL->sublist));
    printf("搜索值d 的结果:");
    printf("%d\n", SearchGList(GL, ‘d‘));
}

/*----------------------函数----------------------*/
//求广义表的长度
int LengthGList(struct GNode *GL)
{
    if(GL!=NULL)
        return(1 + LengthGList(GL->next));
    else
        return(0);
}

//求广义表的深度
int DepthGList(struct GNode *GL)
{
    int max=0;//给max赋初值
    //遍历表中每一个结点,求出所有子表的最大深度
    while(GL!=NULL)
    {
        if(GL->tag==1){
            int dep = DepthGList(GL->sublist);//递归调用求出一个子表的深度
            if(dep > max)
                max = dep;//让max始终为同一层所求过的子表中深度的最大值
        }
        GL = GL->next;//使GL指向同一层的下一个结点
    }
    return(max + 1);//返回表的深度
}

//建立广义表的存储结构
void CreateGList(struct GNode **GL)
{
    char ch;
    scanf("%c", &ch);//读入一个字符,此处只可能读入空格#、左括号或英文字母
    if(ch==‘#‘)//若输入为空格,则置表头指针为空
        *GL = NULL;
    else if(ch==‘(‘)//若输入为左括号则建立由*GL所指向的子表结点并递归构造子表
    {
        *GL = malloc(sizeof(struct GNode));
        (*GL)->tag = 1;
        CreateGList(&((*GL)->sublist));
    }
    else{    //若输入为字符则建立由*GL所指向的单元素结点
        *GL = malloc(sizeof(struct GNode));
        (*GL)->tag = 0;
        (*GL)->data = ch;
    }
    scanf("%c", &ch);//此处读入的字符必为逗号、右括号或分号
    if(*GL==NULL);    //若*GL为空,则什么都不做
    else if(ch==‘,‘)//若输入逗号则递归构造后继表
        CreateGList(&((*GL)->next));
    else if((ch==‘)‘) || (ch==‘;‘))//若输入为右括号或分号则置*GL的后继指针域为空
        (*GL)->next = NULL;
}

//打印输出广义表
void PrintGList(struct GNode *GL)
{
    //对于表结点的处理情况
    if(GL->tag==1){    //存在子表,则输出左括号,作为开始符号
        printf("(");
        if(GL->sublist==NULL)//若子表为空则输出‘#’字符
            printf("#");
        else//若子表非空,则递归输出子表
            PrintGList(GL->sublist);
        printf(")");//当一个子表输出结束后,应输出一个右括号终止符
    }
    else//对于单元素结点,则输出该结点的值
        printf("%c", GL->data);
    if(GL->next!=NULL)//输出结点的后继表
    {
        printf(",");//先输出逗号分隔符
        PrintGList(GL->next);//再递归输出后继表
    }
}

//查找等于给定字符的单元素结点,查找成功则返回1,否则返回0
int SearchGList(struct GNode *GL, ElemType e)
{
    while(GL!=NULL){
        if(GL->tag == 1)//存在子表,则递归搜索本层该子表
        {
            if(SearchGList(GL->sublist, e))
                return(1);
        }
        else//存在单元素结点,则查询是否存在值e ,若存在则返回1
        {
            if(GL->data == e)
                return(1);
        }
        GL = GL->next;//使GL指向同一层的下一个结点
    }
    return(0);//剩下来的情况,GL值为NULL,代表搜索不到值e ,输出0
}
时间: 2024-10-07 14:15:32

广义表的实现的相关文章

c++数据结构之广义表

最近学习了广义表,我们知道广义表也是一种线性表,而顾名思义广义表就是不止一个表,下面来举个栗子: A=( ) B=(1 , 2,3) C=(1 ,2 ,3, ( a , b ,c) ) D=(1, 2, 3, (a,( b,c),d),4) 以上A,B,C,D都是广义表,只不过深度不一样,也就是括号的对数不一样,A是个特殊的广义表,即空表.B里面有三个元素,C里面有6个元素,包括一个子表(a,b,c),C也同理,只不过多了一层子表.由此可总结为一句话:表里有表 这样看可能不太直观,下面以广义表C

数据结构实践项目——数组和广义表

本文针对 [数据结构基础系列网络课程(5):数组和广义表] 1. 数组的基本概念与存储结构 2. 特殊矩阵的压缩存储 3. 稀疏矩阵的三元组表示 4. 稀疏矩阵的十字链表表示 5. 广义表 6. 广义表的存储结构及基本运算的实现 [项目1 - 猴子选大王(数组版)] 一群猴子,编号是1,2,3 -m,这群猴子(m个)按照1-m的顺序围坐一圈.从第1只开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,最后一只出圈的猴子为大王.输入m和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;

广义表的实现(法二)

#include<iostream> #include<string> using namespace std; enum elemTag {ATOM,LIST}; class GList; class GLnode { private: elemTag Tag; //标志是原子还是子表 0:原子 1:子表 union { char data; //原子结点值域 struct //表结点指针域 { GLnode *hp; GLnode *tp; }ptr; }; friend cl

广义表

其中包括广义表的创建.输出.拷贝构造.赋值运算符重载.析构.有效数据个数以及广义表深度 #pragma once #include<iostream> #include<assert.h> #include<ctype.h> using namespace std; enum Type {  HEAD, VALUE, SUB };//头结点.值.子表 struct GeneralizedNode {  Type _type;  //广义表结点类型  Generalize

数据结构之广义表

#include<stdio.h> //广义表的头尾链表存储结构 typedef int AtomType; typedef enum NodeType{ATOM,LIST}ElemTag;//ATOM表示原子结点,LIST表示表节点 typedef struct GLNode{ ElemTag tag; union{ AtomType atom; struct List{ struct GLNode* hp,*tp; } htp; }atom_htp; }GLNode,*GList; //求

数据结构——广义表

定义 Python中的list就是一种广义表,使用起来非常方便.广义表的特点就是能够存储不同类型的元素,也支持嵌套使用,即表中还有表.关于广义表的定义还有几本操作归纳如下: ADT Linear List: 元素组成: 能存储不同元素类型的表结构叫做广义表,支持嵌套操作. 基本操作: InitGList() 创建一个空表 DestoryGList() 销毁一个表 GListLength()  获取表的长度 GListDepth()  获取表的深度 PrintList() 遍历一次表 Insert

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

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

数据结构之---C语言实现广义表头尾链表存储表示

//广义表的头尾链表存储表示 //杨鑫 #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <string.h> #define MAXSTRLEN 40 ) typedef char SString[MAXSTRLEN+1]; typedef char AtomType; // 定义原子类型为字符型 typedef enum{ ATOM, LIST // ATOM==0:原