以邻接矩阵方式确定有向网课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
以邻接矩阵方式确定有向网课程设计报告
《数据结构》
课程设计报告
设计题目:以邻接矩阵方式确定有向网班级:
姓名:
学号:
完成日期:
一、需求分析
1、运行环境(软、硬件环境):
处理器:英特尔酷睿(Core) i5-2410M CPU 2.30GHz
物理内存:2G
操作系统:Microsoft Windowns 7
开发环境:Microsoft Visual Studio 2008
2、程序所实现的功能:
(1)建立并显示出它的邻接链表;
(2)以非递归的方式进行深度优先遍历,显示遍历的结果,
(并随时显示栈的入、出情况);
(3)对改图进行拓扑排序,显示拓扑排序的结果,并随时
显示入度域的变化情况;
(4)给出某一确定顶点到所有其他顶点的最短路径;
3、程序的输入,包含输入的数据格式和说明:
(1)输入节点数个数
(2)输入顶点信息(空格隔开)
(3)输入权值信息(以弧尾值弧头值权值信息,空格
隔开 0 0 0结束;)文档由风行播放器/暴风影音 2014:
/整理
4、程序的输出,程序输出的形式:
(1)邻接链表输出(2)深度优先遍历输出(3)拓扑排序输出(4)最短路径输出
5、测试数据:
(1)节点个数:5个
(2)顶点信息:a b c d e
(3)权值信息:a b 1 b c 2 c d 3 d e 4 a d 5 d c 6 0 0 0
二、设计说明
1、算法设计的思想:
建程序主要是通过建立一个图的模板类来调用相应的构造函数以及相应的成员函数来实现其功能,首先用结构体来存储边节点和顶点节点,用邻接矩阵来存储此有向图,遍历的过程采用双从循环来使得遍历达到最底端,最短路径采用了递归的思想循环调用最短路径函数来完成最短路径的查找,拓扑排序中首先优先输出入度为零的节点,然后通过删除该节点继续此过程进行排序。
2、主要的数据结构设计说明:
图的邻接矩阵结构设计:顶点数、弧数、矩阵数组、和点数组
栈结构:包括栈顶和栈底
点结构:包括顶点和弧相关的指针信息。
3、程序的主要流程图:
有向图
输出邻接表深
度
优
先
遍
拓
扑
排
序
入
度
域
变
化
最
短
路
径历
4、主要模块和函数:
1、邻接矩阵创建有向网void CreatGraph(MGraph *g) 伪码:依次存储节点数、顶点信息、权值
2、打印有向网的邻接矩阵void PrintGraph(MGraph *g) 伪码:依次打印邻接矩阵
3、打印有向网的邻接表void PrintList(MGraph *g)
伪码:输出矩阵每行不为零值纵坐标对应的节点
4、非递归深度优先遍历void DFSTraverse(MGraph *g)
伪码:1.从右向左依次把邻接矩阵第一行非零值纵坐标对应的节点数入栈,并将最后入栈值出栈;
2.再将最后入栈值定为横坐标,重复上述操作,直到空;
3.出栈,重复第二步操作;
4.重复第三部操作,直到栈空;
5、获取每个节点的入度void FindInDegree()
伪码:获取邻接矩阵每行非零值个数
6、拓扑排序
伪码:
int TopologicalSort(MGraph *g)
1.先将度为零节点入栈
2.出栈,对i 号节点的每个邻接点入度减1
3.若入度减为0,则入栈
4.重复2,3 步,直至栈空
7、任意两点最短距离void ShortestPath_FLOYD(MGraph *g)
伪码:先看两点之间有无直接路径,若有,则看有无通过中间点更短
若无,则看有无中间点连通三、源程序代码:
#include
#include
#include
using namespace std;
#define MAX_VERTEX_NUM 20 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OVERFLOW 0
#define ERROR 0
#define OK 1
#define INFINITY 100
//最大顶点个数
//存储空间初始分配量//存储空间分配增量
typedef struct ArcCell //图的邻接矩阵结构定义{
char adj;
int *info; }VertexNode; typedef struct { //顶点
//弧相关信息指针
VertexNode vexs[MAX_VERTEX_NUM];
int
arcs[MAX_VERTEX_NUM][MAX_VERTEX_NU M]; //顶点向量//邻接矩阵
int vexnum,arcnum;
}MGraph;
typedef struct
{
//定点数和弧数
int *base;
int *top;
int stacksize; }SqStack;
/*
函数名称:
函数功能描述://栈底指针
//栈顶指针
//存储空间
findnode
返回结点在数组位置
函数调用之前的预备条件:定义并赋值结点数组返回后的处理:
返回值(如果有的话):函数的输入参数:int
SqStack &S,结点字符a
函
*/
int findnode(char a,MGraph *S)
{
for(int i=1;i<(S->vexnum+1);i++)
{if (S->vexs[i].adj ==a)
return i;}
return -1;
}
/*
函数名称:
函数功能描述:InitStack
构造一个空栈
函数调用之前的预备条件:定义邻接矩阵结构体返回后的处理:
返回值(如果有的话):函数的输入参数:OVERFLOW 或OK SqStack &S
函数的输出参数:
函数的抽象算法(伪码):存储分配
*/
int InitStack(SqStack &S) //构造一个空栈