数据结构与算法课程设计程序及报告样本.doc

数据结构与算法课程设计程序及报告样本.doc

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

数据构造与算法课程设计报告

题目

两两相连房间问题:

一所奇怪房子,这所房子里有n个房间,每个房间里有某些门通向别房间,可是这些门十分奇怪,它们只能从房间a开向房间b,也就是说,一扇从a开向b门是不能让一种人从b房间走到a房间。你能计算一下任意两个房间之间都互相相通吗?

问题分析

此程序需要完毕如下规定:在这所房子里,从任意一种房间开始,按照开门方向,均可以找到一种适当路线,使得一种人可以不重复到达其她每一种房间,因此,需以每一种房间都为一次起始点来走向其她房间,以此来判断这所房子里任意两个房间之间与否互相相通。

实现本程序需要解决如下问题:

如何表达每一种房间,即存储房间信息,并且还要拟定这所房子里各个房间位置。

各个房间之间门,以及门是从哪个房间开向哪个房间该如何表达和存储。

从某一种房间开始,如何走到其她各个房间,即如何对房间进行遍历。

为了在遍历过程中,不重复遍历每一种房间,该如何标记已被遍历过房间,从而只访问未走过房间。

最后通过什么遍历方式才干判断各个房间之间与否互相相通。

数据构造选取和概要设计

通过对题目规定理解,咱们可以用图来表达这所房子,而房子中各个房间就相称于图中各个结点,由于房间门是有方向,一扇从a开向b门是不能让一种人从b房间走到a房间,从而可知该图为有向图,那么门就相称于有向图中弧,从一种门开向另一种门即代表有向图中弧起始点和终结点。

对于图存储,我采用邻接表形式来存储,并将每一种房间进行编号,对于邻接表,则需要定义一种邻接表结点类型、邻接表表头结点类型,通过表头与结点连接而将有向图中弧信息存储起来。那么人从任意一种房间走向另一种房间,即相称于有向图中从一种结点按照弧信息访问其她结点,可以采用深度优先搜索遍历。如果从每一种结点以起始点开始一次遍历就都能访问到其她结点话则阐明有向图是连通图,即该房子里各个房间可以互相相通。定义一种全局整形变量flag,如果是连通图话则flag=1,否则flag=0。

程序实现流程图如下:

main

main()

定义邻接表结点类型、邻接表表头结点类型

创立邻接表函数,由顾客输入房间和门信息,并存入邻接表中

初始化各个房间,标记让其开始都为被访问过

给各个房间编号,以以便存储

建立深度优先搜索函数,用递归方式来遍历各个房间

调用创立邻接表函数和深度优先搜索函数

两两房间可以互相相通

两两房间不可以互相相通

flag与否等于1

算法思想

重要是把现实中房子转换成数据构造与算法中图思想,并用邻接表存储方式来存储图,房子里房间即相称于图中一种个结点,门只能从一种房间开向另一种房间,则阐明了该图是有向图,那么遍历过程中只能按照有向图中弧所指方向来遍历。在深度优先搜索遍历算法中,对于连通图遍历,以某一种结点为起始点开始遍历,只需要遍历一次就可以访问到所有结点,因此以此条件来判断该图与否是连通图,即可得出房子里各个房间与否可以互相相通。

详细设计和重要编码段

一方面构造体类型,分别是邻接表中结点构造类型Arcnode,其包括存储房间号码整形变量adjvex,和指向下一种结点指针nextarc。邻接表中表头结点构造类型Vexnode,其同样包括存储房间号码整形变量vexdata,和指向第一种邻接点指针firstarc,同步定义一种Vexnode类型一维数组,依次将房间信息存储在这个一位数组中。最后定义一种邻接表构造体类型,其中包括Vexnode类型一维数组,将房子中所有房间号码有序存储在一维数组中,以及两个记录房间个数和门个数整形变量。通过以上构造体类型定义,即可得到一种邻接表存储方式,从而将房子转换成图思想把每个房间和每个门信息都存储在邻接表中。

对于建立邻接表函数,也就是将房间和门信息由顾客输入并存储在邻接表中。将房间编号后来,对邻接表表头结点进行初始化:

一方面将房间信息存储进表头结点中:

for(i=1;i<=n;i++){

al[i].vexdata=i;

al[i].firstarc=NULL;

}

数组al[i]是表头结点Vexnode类型,将房间号码存储在一维数组中vexdata中,并让al[i]指针域初始化指向空。

另一方面将门信息存储在邻接表中,即通过表头结点中firstarc指针域来指向第一种邻接点,然后其他邻接点nextarc指针域又指向下一种结点,从而将各个房间串起来。在顾客输入门信息时,如果门是从001号房间开向010号房间,则让顾客输入001010,即拟定了开门方向,就相称于有向图中输入弧起始点和终结点,即可将门所有信息都存储进来了,从而将这所房子用图思想存储在邻接表中。其中,每输入一种门信息,则动态生成一种结点,让一种指针p指向该结点,将弧终结点存入p->adjvex中,采用头插法,将表头结点中

文档评论(0)

181****8690 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档