- 1、本文档共40页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构Ch数组和广义表
数 据 结 构 Ch.5数组和广义表 计 算 机 学 院 肖明军 Email: xiaomj@ /~xiaomj * * * * * * * * * * * * * * * * * §5.3 广义表(Lists) 图示 E=NIL * §5.3 广义表(Lists) 特点 除空表的表头指针为空外,头指针均指向表结点。 任一表结点的hp均指向表头部(原子结点或表结点) 任一表结点的tp均指向表尾部(当表尾部为空表时,tp=NIL,否则必指向表结点) 易分清表中原子和子表所在层次。 如x、L在第一层,a、b在第二层。 最高层的表结点数即为广义表的长度。 浪费空间,易求表长和表深度。 * §5.3 广义表(Lists) (2) 单链表示法 模仿线性表的单链表结构,当所有元素为原子时,等价于单链表。 结点结构: 图示:E=NIL C=(A, B)=((x, (a, b)), ((x, (a, b)), y)) =(A(x, L(a, b)), B(A(x, L(a, b)), y)) * §5.3 广义表(Lists) 存储结构说明 typedef struct GLNode{ int atom; //亦可定义为枚举类型,标志域 struct GLNode *slink; //指向同层后继 union { struct GLNode *slink; //指向子表的第一个结点 DataType data; //原子结点数据域 }optval; //候选值 } *GList; * §5.3 广义表(Lists) 缺点: 若要在某一表中开始处插入或删除一个结点,则要找出所有指向该结点的指针,逐一加以修改。 例如,上图中,删除A表中的x,修改A的头指针外,须修改来自于B、C表的指针,引用来源点不易知道。 删除一个表可能导致错误。 例如,删除A表时,A的所有结点释放后,会引起B、C表的错误。 * §5.3 广义表(Lists) 改进 引入表头结点,使子表内部的变化不会涉及外部元素的变化,插删第一个结点方便。头结点和其他结点结构相同,只是以示区别: 删除表时,头结点引用计数减1,仅当引用计数为0时,才释放表中所有结点。 * §5.3 广义表(Lists) (3) 双链表示法 该方法类似于第6章的二叉链表。 结点结构 存储说明 typedef struct GLNode{ DataType data; //子表名字或原子数据 struct GLNode *link1, *link2; } *GList; * §5.3 广义表(Lists) 图示 特点 简洁方便,类似于二叉链表,可借助于二叉链表表示处理,易求长度深度。 在表结点中保存了子表的名字信息,有时子表名字和原子信息同样重要。 * §5.3 广义表(Lists) 例子 (姓名,工资收入(基本工资,午餐补助,津贴),扣除(公积金,水电费,其它),实发工资) 3. 运算:略 * * * * * * * * * * * * * * * * * * * * * * * * §5.1 多维数组 多维数组 是最易处理的非线性结构。因为各元素类型一致,各维上下界固定,所以它最容易线性化,故可看做是线性表的拓广。例如:二维数组可以看做是由列向量组成的线性表。 * §5.1 多维数组 结构特性 例:二维数组 ,它属于两个向量;i th行和j th列。 除边界外,每个aij恰有两个直接前驱和两个直 接后继。 * §5.1 多维数组 非线性特征 i th行:前驱aij-1,后继aij+1 j th列:前驱ai-1j,后继ai-1j 仅有一个开始结点:a11 仅有一个终端节点:amn 其他边界上的结点只有一个直接前驱或一个直接后继,类似的m维数组 的每一个元素都属于m个向量。 * §5.1 多维数组 存储 一般均采用顺序方式存储,原因是结构中的结点不变动,内存是一维的,必须将多维数组线性化。 行优先(行主序)方式: 将(i+1)th行向量紧接在i th行向量之后: 特点:列下标变化快。Pascal、C等均是此方法。先排最右下标(多维)。 * §5.1 多维数组 列优先(列主序)方法 特点行下标变化最快,先排最左下标(可推广至多维)。Fortan是用此方法。 地址计算 一维存储地址(内部实现)。 基地址——开始结点存储地址Loc(a11). 维数——每维的上下界(若下界固定,则只须知道维长度) 每个元素占用的单元
文档评论(0)