数据结构实践——广义表的原子统计

本文针对数据结构基础系列网络课程(5):数组与广义表的实践项目。

【项目 -广义表的原子统计】

设计算法,求出给定广义表g中的原子个数和最大原子

[参考解答] (头文件glist.h是广义表算法库建设的成果,见链接…

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

int atomnum(GLNode *g)  //求广义表g中的原子个数
{
    if (g!=NULL)
    {
        if (g->tag==0)
            return 1+atomnum(g->link);
        else
            return atomnum(g->val.sublist)+atomnum(g->link);
    }
    else
        return 0;
}

ElemType maxatom(GLNode *g)             //求广义表g中最大原子
{
    ElemType max1,max2;
    if (g!=NULL)
    {
        if (g->tag==0)
        {
            max1=maxatom(g->link);
            return(g->val.data>max1?g->val.data:max1);
        }
        else
        {
            max1=maxatom(g->val.sublist);
            max2=maxatom(g->link);
            return(max1>max2?max1:max2);
        }
    }
    else
        return 0;
}

int main()
{
    GLNode *g;
    char *s="(b,(b,a,(#),d),((a,b),c((#))))";
    g = CreateGL(s);
    DispGL(g);
    printf("\n");
    printf("原子个数 :%d\n", atomnum(g));
    printf("最大原子 :%c\n", maxatom(g));
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-14 00:12:57

数据结构实践——广义表的原子统计的相关文章

javascript实现数据结构:广义表

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

数据结构之广义表

#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; //求

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

数据结构 c++ 广义表

// CTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <string.h> #include <stdio.h> using namespace std; typedef char ElemType; struct GLNode{ bool tag; //标志位 union{ //值域或子表的表头指针域 ElemType data; GLNo

【数据结构】广义表的默认成员函数、深度、大小、打印

广义表的定义: 广义表是非线性的结构,是n个元素的有限序列. 举例:A=(a,b,(c,d)) 我们先定义它的结构: (1)它有三种节点,头节点.值节点.子表节点. (2)两种指向下一节点的指针:指向下一值值节点的指针_next,指向子表节点的指针_sublink. (3)_next与_sublink只有一种 enum Type//用枚举形式来定义广义表中三种节点类型 {     HEAD, //头类型     VALUE,//值类型     SUB,//子表类型 }; struct Gener

数据结构:广义表转置

问题描述 设计算法,将指定的广义表的内容原地逆置.例如:若广义表GL为[1, [2, 3], 4, [5, [6, 7], 8], 9],逆置后GL为 [9, [8, [7, 6], 5], 4, [3, 2], 1] . 基本思路 如题,一眼就能看出问题具有递归性,因此采用递归来求解,代码就非常简单了. Python实现 #encoding = utf8 def reverse_table(table): ''' 递归 ''' if not isinstance(table,list) or

数据结构实践——顺序表应用

[项目 - 顺序表应用] 定义一个采用顺序结构存储的线性表,设计算法完成下面的工作: 1.删除元素在[x, y]之间的所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1): 2.将所在奇数移到所有偶数的前面,要求算法的时间复杂度为O(n),空间复杂度为O(1). 提示: (1)充分利用前面建立的算法库解决建立顺序表.输出线性表的问题: (2)为保证复杂度的要求,设计算法并用专门的函数实现算法: (3)每项工作写一个程序,并发布博文,展示你的实践成果. [参考解答] (注:项目中所需要的

数据结构实践——顺序表:两集合的交集

[项目 - 求集合并集] 假设有两个集合 A 和 B 分别用两个线性表 LA 和 LB 表示,即线性表中的数据元素即为集合中的成员.设计算法,用函数unionList(List LA, List LB, List &LC )函数实现该算法,求一个新的集合C=A∪B,即将两个集合的并集放在线性表LC中. 提示: (1)除了实现unnionList函数外,还需要在main函数中设计代码,调用unionList进行测试和演示: (2)可以充分利用前面建好的算法库[点击-],在程序头部直接加 #incl

数据结构(C语言第2版)-----数组,广义表,树,图

任何一个算法的设计取决于选定的数据结构,而算法的实现依赖于采用的存储结构. 之前线性表的数据元素都是非结构的原子类型,元素的值是不可再分的.下面学习的这两个线性表是很特殊的,其中数据元素本身也可能是一种数据结构. 认识数组和广义表 数组可以看成是一种特殊的线性表,也就是线性表中的数据元素本身也是一个线性表,数组中的个元素具有统一的类型.其实说白了就是在脑海中想数组中的数据如何在内存中以什么形式的线性表来存储.在C语言中,一个二维数组可以定义为其分量类型为一维数组类型的一维数组类型. 数组一旦被建