当前位置:文档之家› 数据结构课程设计-图的邻接矩阵

数据结构课程设计-图的邻接矩阵

数据结构课程设计报告设计题目:图的邻接矩阵存储结构院系计算机学院年级x 级学生xxxx学号xxxxxxxxxx指导教师xxxxxxxxx起止时间10-6/10-102013年10月10日目录1 需求分析 (4)2 概要设计 (4)2.1 ADT描述 (4)2.2程序模块结构 (5)2.3各功能模块 (6)3详细设计 (7)3.1类的定义 (7)3.2 初始化 (8)3.3 图的构建操作 (8)3.4 输出操作 (9)3.5 get操作 (9)3.6 插入操作 (10)3.7 删除操作 (100)3.8 求顶点的度操作 (111)3.9 深度遍历作 (11)3.10 判断连通操作 (12)3.11 主函数 (13)4 调试分析 (16)4.1调试问题 (16)4.2 算法时间复杂度 (16)5用户手册 (16)5.1主界面 (16)5.2 创建图 (17)5.3插入节点 (17)5.4 深度优先遍历 (17)5.5 求各顶点的度 (18)5.6 输出图 (18)5.7 判断是否连通 (19)5.8 求边的权值 (19)5.9 插入边 (19)5.10 删除边 (20)结论 (20)参考文献 (20)摘要随着计算机的普及,涉及计算机相关的科目也越来越普遍,其中数据结构是计算机专业重要的专业基础课程与核心课程之一,为适应我国计算机科学技术的发展和应用,学好数据结构非常必要,然而要掌握数据结构的知识非常难,所以对“数据结构”的课程设计比不可少。

本说明书是对“无向图的邻接矩阵存储结构”课程设计的说明。

首先是对需求分析的简要阐述,说明系统要完成的任务和相应的分析,并给出测试数据。

其次是概要设计,说明所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次关系,以及ADT描述。

然后是详细设计,描述实现概要设计中定义的基本功操作和所有数据类型,以及函数的功能及代码实现。

再次是对系统的调试分析说明,以及遇到的问题和解决问题的方法。

然后是用户使用说明书的阐述,然后是测试的数据和结果的分析,最后是对本次课程设计的结论。

关键词:网络化;计算机;对策;图;储存。

1 需求分析随着计算机的普及,信息的存储逐渐和我们的日常生活变得密切起来,而数据的存储方式也多种多样,比如树、链表、数组、图等等。

为了充分体现图的矩阵储存结构的优势与功能,要求本系统应达到以下要求:1.图是无向带权图2.能从键盘上输入各条边和边上的权值;3.构造图的邻接矩阵和顶点集。

4.输出图的各顶点和邻接矩阵5.插入一条边6.删除一条边7.求出各顶点的度8.判断该图是否是连通图,若是,返回1;否则返回0.9.使用深度遍历算法,输出遍历序列。

2 概要设计2.1 ADT描述ADT Glist{{VR}={图的顶点和边}VR={<v,w> | v,w∈V, <v,w>表示顶点v和w间的边;}基本操作:初始化空图;输入建立图;深度优先遍历图;确定图中的顶点数目;确定图中边的数目;在图中插入一个顶点;在图中插入一条边;删除图中一个顶点删除图中的一条边;求顶点的度;求最小生成树;} ADT Graph;2.2程序模块结构图2.1:模块结构2.2.1结构体定义本系统未采用结构体方法,类的定义如下:定义顶点: nodecount,edgecount 边:已经分别存放顶点和边的两个数组:a[MaxNode]和b[MaxNode][MaxNode];其余成员函数均以public形式声明。

在邻接矩阵表示的图中,顶点信息用一维数组表示a[]。

在简单情况下可省略,仅以下标值代表顶点序号。

若需要,顶点信息更加丰富。

边(或弧)信息用二维数组表示b[ ][ ],这也是邻接矩阵。

包含边的权值。

在类中数据成员有4个,重要的是邻接矩阵Edge[ ][ ]、总边数edgecount和顶点数nodecount。

class Graph1{private:int nodecount;//节点int edgecount;//边int a[MaxNode];//顶点信息组//set<int> a;int b[MaxNode][MaxNode];//权值信息组public:Graph1(int);//构造函数int getNodeCount();//当前的节点数int getEdgeCount();//当前的边数void insertNode(int);//插入一个节点void isertEdge(int ,int ,int);//插入一条边void deleteEdge(int,int);//删除一条边bool isliantong();//判断是否连通int getWeight(int,int);//获得某条边的权值int Depth(int );//深度遍历准备,用于建立顶点访问数组和记录所访问顶点个数void Depth(int v,int visited[],int &n);//深度遍历void outDu(Graph1 G);//输出节点个数void PrintOut(Graph1 G) ;//输出图void CreatG(int n,int e); //建立图};2.3各功能模块以下将以注释形式为每个函数的功能进行声明:构造函数:Graph1(int) 用于初始化图get函数:int getNodeCount();得到当前的节点数get函数:int getWeight(int,int);获得某条边的权值get函数:int getEdgeCount();得到当前的边数插入函数:void insertNode(int);插入一个节点插入函数:void isertEdge(int ,int ,int);插入一条边删除函数:void deleteEdge(int,int);删除一条边判断函数:bool isliantong();判断是否连通遍历函数1:int Depth(int );//深度遍历准备,用于建立顶点访问数组和记录所访问顶点个数遍历函数2:void Depth(int v,int visited[],int &n);//深度遍历求度函数:void outDu(Graph1 G);输出节点个数输出函数:void PrintOut(Graph1 G) ;输出图构建函数:void CreatG(int n,int e);建立图3详细设计3.1类的定义class Graph1{private:int nodecount;//节点int edgecount;//边int a[MaxNode];//顶点信息组//set<int> a;int b[MaxNode][MaxNode];//权值信息组public:Graph1(int);//构造函数int getNodeCount();//当前的节点数int getEdgeCount();//当前的边数void insertNode(int);//插入一个节点void isertEdge(int ,int ,int);//插入一条边void deleteEdge(int,int);//删除一条边void prim(int);//生成最小树bool isliantong();//判断是否连通int getWeight(int,int);//获得某条边的权值int Depth(int );//深度遍历准备,用于建立顶点访问数组和记录所访问顶点个数 void Depth(int v,int visited[],int &n);//深度遍历void outDu(Graph1 G);//输出节点个数void PrintOut(Graph1 G) ;//输出图void CreatG(int n,int e); //建立图};3.2 初始化初始化邻接矩阵以及有关参数,通过for循环将数组的值都初始化为0,使之成为一个空图。

Graph1::Graph1(int s=MaxNode)//构造函数{for(int i=0;i<=s-1;i++)for(int j=0;j<=s-1;j++)b[i][j]=0;nodecount=0;for(int k=0;k<=s-1;k++)a[k]=-1;}3.3 图的构建操作在主函数中要求输入需要构建的图的顶点数和边数,调用构建函数,分别用两个for语句来构建图(即输入顶点的值和边的权值),此处要求输入有一定的顺序,不能随意输入。

void Graph1::CreatG(int n,int e){ int i,vi,vj,w;edgecount=e;nodecount=n;cout<<endl<<" 输入顶点的信息(暂设为整型):" ;for ( i=0; i<nodecount; i++ ){ cout<<"\n "<<i+1<<": "; cin>>a[i]; }for ( i=0; i<edgecount; i++ ) //输入两个顶点编号和边权值{ cout<<endl<<" 输入边的信息(vi,vj,w):"<<endl;;cin>>vi>>vj>>w;b[vi-1][vj-1]=w;b[vj-1][vi-1]=w; }}3.4 输出操作本函数通过传过来的对象G得到相关数组,通过for循环来分别输出顶点数组和边的权值数组(邻接矩阵)。

void Graph1::PrintOut(Graph1 G){ int i;cout<<"\n 输出顶点的信息:"<<endl;for ( i=0; i<G.getNodeCount(); i++ ) cout<<G.a[i]<<" ";cout<<endl<<"\n 输出邻接矩阵:" ;for ( i=0; i<G.getNodeCount(); i++ ){ cout<<endl<<i+1<<": ";for ( int j=0; j<G.getNodeCount() ;j++ ) cout<<G.b[i][j]<<" ";cout<<endl;}}3.5 get操作用于得到图的顶点数、边数、权值int Graph1::getNodeCount()//当前的节点数{return nodecount;}int Graph1::getEdgeCount()//当前的边数{return edgecount;}int Graph1::getWeight(int x,int y)//获得某条边的权值{return b[x-1][y-1];}3.6 插入操作插入顶点:通过将传来的值(顶点值)赋到一个当前顶点数下一个的数组元素中实现插入功能,此时顶点树加1。

相关主题