• 广义表相关总结


    广义表相关总结

    一.定义

    广义表是线性表的推广,广义表中每个元素可以是原子,也可以是子表,原子即单个元素,而子表是广义表。我们可以发现,其实python中的数组就是一个广义表,其内元素可以是单个的元素,也可以是一个数组。

    二.广义表的长度和深度

    1.长度

    广义表的长度就是看第一层所含的元素个数

    2.深度

    广义表的深度是max(每个元素深度) + 1

    • A=():A是一个空表,长度为0,深度为1
    • B=(e):B只有一个原子e,B的长度为1,深度为1
    • C=(a,(b,c,d)):C的长度为2,深度为2
    • D=(A,B,C)=((),(e),(a,(b,c,d))):D的长度为3,深度为3
    • E=(a,E):E是一个递归的表,长度为2,深度无限。

    三.广义表的存储结构

    1.头尾链表存储表示

    a):首先,我们要知道一个概念,当广义表LS非空时,我们把第一个元素a1称为LS的表头,其余元素加上最外层的括号组成的表(a2,a3,a4,...,an)作为LS的表尾。我们可以发现,表头可能是原子也可能是表,但是表尾一定是表。

    b):我们可以发现广义表中有两种不同的元素,所以我们可以定义两个不同的结点,表结点和原子结点来存储。

    tag=1 hp tp

    表结点,其中hp指向表头,tp指向表尾。

    tag=0 data

    原子结点

    c):例子
    L=(a,(x,y),((x)))

    2.子表存储表示

    a):这种表示方法应该说更好理解一些,就是把表中每个元素分开来看,而不是从表头表尾去分析。

    tag=1 hp tp

    表结点,其中hp指向子表,tp指向下一个元素结点。

    tag=0 data tp

    表结点,其中data是原子项的值,tp指向下一个元素结点。

    b):例子
    L=(a,(x,y),((x)))

    四.递归求广义表深度

    int GListDepth(GList L){
    	if(!L) return 1;//空表则返回1
    	if(L->tag == 0) return 0;//原子项返回0
    	for(max = 0, pp = L; pp; pp = pp->ptr.tp){//在元素间循环遍历
    		dep = GListDepth(pp->ptr.hp);//获取每个子表深度
    		if(dep > max) max = dep;//和最大的比较
    	}
    	return max + 1;//由于深度是每个元素深度+1.所以返回max+1
    }
  • 相关阅读:
    程序员需要知道的知识
    ajax原理图
    线性表及其操作
    JDBC连接SQL server 2005 全过程
    asp.net生命周期
    终于在博客园里申请了自己的博客
    C#反射类中所有字段,属性,方法
    继续学习NHibernate
    C#中方法的四种参数类型
    Forms权限认证
  • 原文地址:https://www.cnblogs.com/FZfangzheng/p/9135163.html
Copyright © 2020-2023  润新知