数据结构——基于Python语言(微课版) 课件T11_数组与广义表(广义表).pptx

数据结构——基于Python语言(微课版) 课件T11_数组与广义表(广义表).pptx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

广义表;广义表(Lists,简称表)是一种非线性的数据结构,它是线性表的推广。广义表放宽了表中对原子级元素的限制,它可以存储线性表中的数据,也可以存储广义表其自身结构。

广义表的表示与线性表相似,也是n个元素的有限序列。

;广义表中的数据元素有相对次序;

广义表的长度为表中的元素个数,即最外层括弧包含的元素个数;

广义表的深度为表中所含括弧的重数。其中单元素的深度为0,空表的深度为1;

广义表可以共享,一个广义表可以被其它广义表共享,这种共享广义表称为再入表;

广义表可以是一个递归的表,即一个广义表的子表可以是它自身。递归广义表的深度无穷,长度有限。

;通常使用链式存储来存储广义表。

其存储结点结构如下:;定义五个广义表:

A=()

B=(p)

C=((x,y,z),p)

D=(A,B,C)

E=(q,E)

;递归定义:递归是指一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法。

递归必须满足以下两个条件:

(1)子问题与原问题性质相同,且更为简单。

(2)存在一种可以使递归退出的简单情境,即递归必须要有终止条件。

递归一般用于解决三类问题:

(1)数据本身是按递归定义的。如斐波那契(Fibonacci)数列;

(2)问题求解过程是使用递归算法实现的。如Hanoi问题;

(3)数据的结构形式是按递归定义的。如二叉树、广义表等。

;广义表的创建:

创建广义表也是一个递归的过程:在创建表时,需要逐个地创建其中的单元素和子表;在创建子表时,重复前面的步骤,只是将要创建的表的参数变为子表。

;广义表的创建:

创建广义表需要扫描的字符分为以下四种:

(1)“(”。当遇到左括号,表示遇到了一个表,需要申请一个结点空间存放数据,并将结点中的tag置为1,然后进行递归调用,将结点的ls-value.Lists指针地址作为参数传入函数。

(2)“)”。当遇到右括号时,表示前面的字符串已经处理完毕,应将当前传入的参数指针置空。这个传入的参数指针可能为ls-value.Lists指针地址,或ls-link指针地址。

(3)“,”。当遇到逗号时,表示当前的结点处理完毕,应该处理后继结点,此时进行递归调用??传入ls-link指针地址。

(4)其它字符。遇到其它字符,表示的是结点中存储的数据,将ls-tag置为0,将当前字符赋值给ls-value.atom。

创建的广义表大体上可以分为三类:单元素表、空表、非空多元素广义表。其中单元素表和空表,是递归的边界条件;在创建非空广义表时,递归创建子表,是其条件归纳。

;输出广义表:

输出广义表ls的步骤如下所示:

(1)若ls-tag为0,表示该表为单元素,直接输出元素;

(2)若ls-tag为1,表示这是一个表,输出左括号“(”,然后根据ls-value.Lists判断:

若ls-value.Lists为NULL,说明这是一个空表,输出右括号“)”;

若ls-value.Lists不为空,进行递归调用,将ls-value.Lists作为变量传入函数。

(3)在子表的结点输出完成之后,函数会回到递归调用处,然后根据ls-link判断当前结点在本层之中是否有后继结点:

若ls-link为NULL,说明本层遍历结束,返回函数调用处;

若ls-link不为空,说明本层中当前元素还有后继,输出一个“,”,之后进行递归调用,将ls-link作为变量传入函数。;求广义表的深度:

递归求广义表深度的两个重要因素。

(1)递归公式:Depth(LS)=max{Depth(ai)}+1(1≤i≤n,n≥1)

(2)边界条件:Depth(LS)=1 当LS为空表时

Depth(LS)=0 当LS为单元素时

求深度的基本思路:假设ls是一个LSNode*类型的变量,当ls-tag为0时,该表只有一个单元素,函数返回其深度0;当ls-tag为1时,表明这是一个表,根据ls-value.Lists来判断这是否是一个空表:如果是空表,则返回其深度1;如果不是空表,遍历表中的每一个元素,递归遍历子表元素。

;总结

您可能关注的文档

文档评论(0)

balala11 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档