广义表

广义表的存储结构(广义表的递归算法,复制广义表,求广义表的深度)

廉价感情. 提交于 2020-03-01 08:26:03
// c5-5.h 广义表的头尾链表存储结构(见图5.16) enum ElemTag{ATOM,LIST}; // ATOM==0:原子,LIST==1:子表 typedef struct GLNode { ElemTag tag; // 公共部分,用于区分原子结点和表结点 union // 原子结点和表结点的联合部分 { AtomType atom; // atom是原子结点的值域,AtomType由用户定义 struct { GLNode *hp,*tp; }ptr; // ptr是表结点的指针域,prt.hp和ptr.tp分别指向表头和表尾 }; }*GList,GLNode; // 广义表类型 图517 是根据c5-5.h 定义的广义表(a,(b,c,d))的存储结构。它的长度为2,第1 个元素为原子a,第2 个元素为子表(b,c,d)。 // c5-6.h 广义表的扩展线性链表存储表示(见图5.18) enum ElemTag{ATOM,LIST}; // ATOM==0:原子,LIST==1:子表 typedef struct GLNode1 { ElemTag tag; // 公共部分,用于区分原子结点和表结点 union // 原子结点和表结点的联合部分 { AtomType atom; // 原子结点的值域 GLNode1 *hp; // 表结点的表头指针 };

广义表的概念

核能气质少年 提交于 2020-03-01 08:22:23
广义表的概念  广义表(Lists,又称列表)是线性表的推广。即广义表中放松对表元素的原子限制,容许它们具有其自身结构。 1、广义表定义   广义表 是n(n≥0)个元素a 1 ,a 2 ,…,a i ,…,a n 的有限序列。 其中:  ①a i --或者是原子或者是一个广义表。    ②广义表通常记作: Ls=( a 1 ,a 2 ,…,a i ,…,a n )。    ③Ls是广义表的名字,n为它的 长度 。     ④若a i 是广义表,则称它为Ls的 子表 。 注意:  ①广义表通常用圆括号括起来,用逗号分隔其中的元素。  ②为了区分原子和广义表,书写时用大写字母表示 广义表 ,用小写字母表示 原子 。  ③若广义表Ls非空(n≥1),则a l 是LS的表头,其余元素组成的表(a 1 ,a 2 ,…,a n )称为Ls的表尾。   ④广义表是递归定义的 2、广义表表示 (1)广义表常用表示   ① E=()  E是一个空表,其长度为0。   ② L=(a,b)  L是长度为2的广义表,它的两个元素都是原子,因此它是一个线性表   ③ A=(x,L)=(x,(a,b))  A是长度为2的广义表,第一个元素是原子x,第二个元素是子表L。   ④ B=(A,y)=((x,(a,b)),y)   B是长度为2的广义表,第一个元素是子表A,第二个元素是原子y。   ⑤ C=(A,B

数据结构28:广义表及M元多项式

Deadly 提交于 2020-03-01 07:41:59
广义表,又称为列表。记作: LS = (a 1 ,a 2 ,…,a n ) ;( LS 为广义表的名称, a n 表示广义表中的数据)。 广义表可以看作是线性表的推广。两者区别是:线性表中的数据元素只能表示单个数据元素;广义表中的单个数据元素 a i ,既可以是单个元素,也可以是广义表。 原子和子表 在广义表中,单个元素被称为 “原子”;包含的广义表被称为 “子表”。 例如: A = () :A 表示一个广义表,只不过表是空的,广义表 A 的长度为 0。 B = (e) :广义表 B 中只有一个原子 e ,长度为 1。 C = (a,(b,c,d)) :广义表 C 中有两个元素,原子 a 和子表 (b,c,d) ,广义表C的长度为 2。 D = (A,B,C) :广义表 D 中有三个元素:子表 A、B、C,长度为 3 ,这种表示方式等同于: D = ((),(e),(b,c,d)) 。 E = (a,E) :广义表 E 中有两个元素,原子 a 和它本身,长度为 2 。这是一个递归的表,等同于:E = (a,(a,(a,…)))。 A = () 和 A = (()) 是不一样的:前者是空表,长度为 0 ;后者表的长度为 1 ,包含的元素是一个子表,只不过这个子表是空表。 表头和表尾 当广义表不为空时,称表中的第一个元素为表的 “表头” ;剩余所有元素组成的表为 “表尾” 。

【C/C++】实现数据结构广义表

末鹿安然 提交于 2020-03-01 07:40:01
1. 广义表的定义 每个元素可以为Atom,原子,也可以为线性表。 线性表的推广。线性表元素有唯一的前驱和后继,为线性表,而广义表是多层次的线性表 表头:第一个元素,可能是原子,可能是广义表 表尾:除了第一个元素,剩余的元素,所构成的广义表 举例: A = (a,b,(c,d),e) head(A) = a tail(A) = (b,(c,d),e) 遍历操作: 取表头,取表尾 ,取表头.. 长度:最外层的元素数,即最外层的','+1 深度:括号层数 2. 广义表的两种存储结构(子表法) 2.1链式存储结构 - 每个数据元素可以用一个节点表示 元素可以为原子或列表 原子节点:标志域、值域 列表节点:标志域、指示表头的指针域、指示表尾的指针域 空表:A = NULL 除了空表,表头指针指向一个表节点,表节点再分表头、表尾... 最高层表节点(可能原子、子表)的个数就是表长度? A = (a,b,(c,d),e) 最高层表头是先a,表尾是(b,(c,d),e),表头是b,表尾((c,d),e)..就是第一层的表尾直到为空之前,有过的表尾指针+1 判断是否在同一层次? 是这样的: 最高层处于同一层,后继的tail指针指向的是同一层,否则,head指针,或者表头是Atom,都是下一层。 2.2扩展线性表存储结构 不是用表头表尾指针了,而是,每一个节点,不管是子表还是原子

广义表

不问归期 提交于 2020-03-01 07:29:17
广义表, 顾名思义 ,它也是线性表的一种推广。它被广泛的应用于人工智能等领域的表处理 语言 LISP语言中。在LISP语言中,广义表是一种最 基本 的数据 结构 ,就连LISP 语言的程序也表示为一 系列 的广义表。 在第二章中,线性表被定义为一个有限的 序列 (a1,a2,a3,…,an)其中ai被限定为是单个数据元素。广义表也是n个数据元素d1,d2,d3,…,dn的有限序列,但不同的是,广义表中的di 则既可以是单个 元素 ,还可以是一个广义表,通常记作:GL=(d1,d2,d3,…,dn)。GL是广义表的名字,通常广义表的名字用大写 字母 表示。n是广义表的长度。若其中di是一个广义表,则称di是广义表GL的子表。在广义表GL中,d1是广义表GL的表头,而广义表GL其余部分组成的表(d2,d3,…,dn)称为广义表的表尾。由此可见广义表的定义是递归定义的。因为在定义广义表时,又使用了广义表的概念。下面给出一些广义表的例子,以加深对广义表 概念 的 理解 。 l D=() 空表;其长度为零。 l A=(a,(b,c)) 表长度为2的广义表,其中第一个元素是单个数据a,第二个元素是一个子表(b,c)。 l B=(A,A,D) 长度为3的广义表,其前两个元素为表A,第三个元素为空表D。 l C=(a,C) 长度为2递归定义的广义表,C相当于无穷表C=(a,(a,(a,(…))))

代码面试之广义表

社会主义新天地 提交于 2020-03-01 06:57:57
广义表的基本概念 广义表(Lists,又称列表) 是线性表的推广。线性表定义为n>=0个元素a1,a2,a3,…,an的有限序列。线性表的元素仅限于原子项,原子是作为结构上不可分割的成分,它可以是一个数或一个结构,若放松对表元素的这种限制,容许它们具有其自身结构,这样就产生了广义表的概念。 广义表是n (n>=0)个元素a1,a2,a3,…,an的有限序列,其中ai或者是原子项,或者是一个广义表。通常记作LS=(a1,a2,a3,…,an)。LS是广义表的名字,n为它的长度。若ai是广义表,则称它为LS的子表。 抽象数据类型广义表的定义如下: ADT Glist { 数据对象: D={ei | i=1,2,..,n;n>=0 ; eiÎAtomSet 或ei ÎGlist, AtomSet为某个数据对象} 数据关系:R1={< ei-1, ei > | ei-1 , ei ÎD,2<=i<=n} 基本操作: InitGList( &L); 操作结果:创建空的广义表L。 CreateGList(&L,S); 初始条件:S是广义表的书写形式串。 操作结果:由S创建广义表L。 DestroyGList(&L); 初始条件:广义表L存在。 操作结果:销毁广义表L。 CopyGList( &T,L); 初始条件:广义表L存在。 操作结果:由广义表L复制得到广义表T。 GListLength

【数据结构】数组和广义表

自作多情 提交于 2020-03-01 06:55:18
感觉数组这一段没讲什么太多的东西。 先是讲了下定义,就是每个维度上都有对应的前驱后继,首尾元素例外。操作只有初始化 销毁 取元素 修改元素。然后讲了下适合用顺序存储结构,多维情况下根据下标(j1 j2 j3 ... jn)找到对应像素的存储位置 c n = L, c i-1 = b i * c i, LOC = LOC基址 + Σc i j i , L为每个元素存储的单位。 然后给了些实现代码。 新知识是: va_start( , ); va_arg( , ); va_end(); 这三个可以用来处理变长参数表信息。 接着就是讲矩阵了。 首先是特殊矩阵的压缩。对于有规律的特殊矩阵,如对角矩阵、下(上)三角矩阵,对角矩阵。可以根据规律将矩阵存在一维数组中,建立起原始下标与压缩后矩阵下标的对应关系就好。 对没有规律的稀疏矩阵,只存储稀疏矩阵的非0元。需要三元组表存储(行、列、元素值)。根据三元组表的不同表示方式,得到稀疏矩阵不同的压缩存储方法。 ①三元组顺序表 以行序为主序排列。 就是用个数组存起来,行号小的放前面。 讲了下这种结构下转置的操作,关键讲了下如何在转置后以行为主排序。又讲了个快速转置,就是存储了原矩阵每一列首元素的位置和每一列元素个数,这样就不用在之后排序了,直接放在对的位置就好了。 ②行逻辑链接的顺序表,就是把每行第一个非0位置存了起来,为了方便抽取任意一行

广义表

百般思念 提交于 2020-02-28 16:31:45
广义嘛,有点类似类比的意思,那么广义表就是线性表的推广,也称列表。 逻辑结构为 GL = (a1,a2,…ai,…an) 广义表具有以下的特性: 广义表中的数据元素是相对有次序的; 广义表的长度要取层次的最外层; 广义表的深度为包含括号的层数,比如原子是孤儿所以他就没有深度,空表连原子都没有偏偏就占一个深度; 广义i傲视可以被共享的,可以被共享的广义表被称为再入表(目前没发现有啥卵用); 广义表可以是递归的表,我觉得这取决于它的存储结构,这种递归在前面的链表哪里就讲得很透彻了; 一般的广义表都长下面这样 啥都没有只有括号的是空表 小写字母表示没有儿子的原子 大写字母表示一个有若干儿子的表(表名) 一个括号表示一个表,就像套娃娃一样可以查里面添加括号(子表) 若是把表名写在表(括号)的前面,没名字用” · “表示,那么上面的哪些广义表又变成了虾米那这样子: 大概也就这意思: 广义表的存储结构 这里又扯到前面所讲的递归了,只不过是用共用体改进了一下; 就我看来有点和双链表相似 tag给他存上一个int型的数据,如果: tag=0,表示这个结点存的是原子(DATA),后面的link是一个指针域,要是还有其他的同级原子或者表,那么就用link指向他们,没有就置空(NULL); tag=1,表示这个结点是一个表结点(sublist),存放一个地址指向它的儿子们。后面的link同样是一个指针域

广义表的长度和广义表的深度

拜拜、爱过 提交于 2020-02-02 14:25:18
广义表的长度和广义表的深度 广义表是对线性表的扩展——线性表存储的所有的数据都是原子的(一个数或者不可分割的结构),且所有的数据类型相同。而广义表是允许线性表容纳自身结构的数据结构。 广义表定义: 广义表是由n个元素组成的序列:LS = (a1,a2, ... an);其中 ai是一个原子项或者是一个广义表。n是广义表的长度。若ai是广义表,则称为LS的子表。 广义表表头和表尾: 若广义表LS不空,则a1,称为LS的表头,其余元素组成的子表称为表尾。 广义表的长度: 若广义表不空,则广义表所包含的元素的个数,叫广义表的长度。 广义表的深度: 广义表中括号的最大层数叫广义表的深度。 例如: 对广义表LS=((),a,b,(a,b,c),(a,(a,b),c)) 表头为子表LSH = (); 表尾为子表LST = (a,b,(a,b,c),(a,(a,b),c)); 广义表LS的长度:5 广义表LS的深度:3 来源: CSDN 作者: zhupengqq1 链接: https://blog.csdn.net/zhupengqq1/article/details/104141683

数据结构--广义表

心不动则不痛 提交于 2020-01-21 04:16:24
广义表的定义 带表名的广义表表示 广义表的特性 线性结构 多层次结构,有深度 可共享 可递归 广义表抽象数据类型 package pers . zhang . genList ; /** * @author zhang * @date 2020/1/20 - 10:57 * * 广义表抽象数据结构 */ public interface GGenList < T > { //判断广义表是否为空 boolean isEmpty ( ) ; //返回广义表长度 int length ( ) ; //返回广义表的深度 int depth ( ) ; //插入原子x作为第i个元素 GenListNode < T > insert ( int i , T x ) ; //插入子表作为第i个元素 GenListNode < T > insert ( int i , GenList < T > glist ) ; } 广义表的存储结构 广义表的单链表示: 广义表的双链表示: 广义表双链表示的实现 广义表双链表示的节点类: package pers . zhang . genList ; /** * @author zhang * @date 2020/1/20 - 11:03 * * 广义表双链表示的节点类 */ public class GenListNode < T > { //数据域