数据结构课程设计-图的邻接矩阵
图-存储结构-数组表示法(邻接矩阵)

图-存储结构-数组表⽰法(邻接矩阵)⽂字描述 ⽤两个数组分别存储顶点信息和边/弧信息。
⽰意图算法分析 构造⼀个采⽤邻接矩阵作存储结构、具有n个顶点和e条边的⽆向⽹(图)G的时间复杂度是(n*n + e*n), 其中对邻接矩阵G.arcs的初始化耗费了n*n的时间。
借助于邻接矩阵容易判定两个顶点之间是否有边/弧相连,并容易求得各个顶点的度。
对于⽆向图,顶点vi的度是邻接矩阵地i⾏(或第i列)的元素之和;对于有向图,第i⾏的元素之和为顶点vi的出度;第j列的元素之和为顶点vj的⼊度;代码实现1/*2以数组表⽰法(邻接矩阵)作为图的存储结构创建图。
3*/4 #include <stdio.h>5 #include <stdlib.h>6 #include <string.h>78#define INFINITY 100000 //最⼤值9#define MAX_VERTEX_NUM 20 //最⼤顶点数10 typedef enum {DG, DN, UDG, UDN} GraphKind; //{有向图,有向⽹,⽆向图,⽆向⽹}11 typedef int VRType;12 typedef char VertexType;13 typedef struct{14char note[10];15 }InfoType;16 typedef struct ArcCell{17 VRType adj; //顶点关系类型:1)对⽆权图,⽤1或0表⽰相邻否;2)对带权图,则为权值类型18 InfoType *info; //该弧相关信息的指针19 }ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];20 typedef struct{21 VertexType vexs[MAX_VERTEX_NUM]; //顶点向量22 AdjMatrix arcs; //邻接矩阵23int vexnum, arcnum; //图的当前顶点数和弧数24 GraphKind kind; //图的种类标志25 }MGraph;2627/*28若G中存在顶点u,则返回该顶点在图中位置;否则返回-1。
邻接表 邻接矩阵

邻接表与邻接矩阵1. 引言在图论中,邻接表和邻接矩阵是两种常见的表示图结构的方法。
图是由节点(顶点)和连接节点的边组成的一种数据结构,广泛应用于计算机科学和其他领域。
邻接表和邻接矩阵是两种不同的数据结构,用于表示图中节点之间的连接关系。
它们在不同的应用场景下有着各自的优势和劣势。
本文将详细介绍邻接表和邻接矩阵的定义、特点、使用场景以及它们之间的比较。
2. 邻接表邻接表是一种使用链表来表示图中节点连接关系的数据结构。
对于每个节点,我们使用一个链表来存储与该节点直接相连的所有节点。
2.1 定义邻接表由两部分组成:一个顶点数组和一个边链表数组。
顶点数组存储了图中所有节点,而边链表数组则存储了与每个节点直接相连的其他节点。
2.2 特点•空间效率高:对于稀疏图(边数相对于节点数较少),邻接表只需要存储非零边,节省了存储空间。
•插入和删除节点高效:由于邻接表使用链表来存储边,插入和删除节点的操作只需要改变链表指针的指向,时间复杂度为O(1)。
•查询两个节点是否相连的效率较低:在邻接表中,要判断两个节点是否相连需要遍历链表来查找,时间复杂度为O(n),其中n为节点数。
2.3 使用场景邻接表适用于以下情况:•图是稀疏图(边数相对于节点数较少)。
•需要频繁地插入和删除节点。
•不需要快速判断两个节点是否相连。
3. 邻接矩阵邻接矩阵是一种使用二维数组来表示图中节点连接关系的数据结构。
对于有n个节点的图,我们使用一个n×n的矩阵来表示图中每对节点之间的连接关系。
3.1 定义邻接矩阵由一个二维数组组成。
数组的大小为n×n,其中n为图中节点的数量。
如果两个节点之间有边连接,则对应位置上的元素值为1;否则,元素值为0。
3.2 特点•查询两个节点是否相连高效:在邻接矩阵中,可以通过直接访问矩阵中的元素来判断两个节点之间是否有边相连,时间复杂度为O(1)。
•插入和删除节点效率较低:由于邻接矩阵需要改变矩阵中的元素值来插入或删除边,时间复杂度为O(n),其中n为节点数。
有向图的邻接矩阵

有向图的邻接矩阵有向图的邻接矩阵设有向图,,。
令为邻接到的边的条数,称为D的邻接矩阵,记作。
为图7.12的邻接矩阵,不难看出:(1)(即第i行元素之和为的出度),。
(2)(即第j列元素之和为的入度),。
(3)由(1),(2)可知,为D中边的总数,也可看成是D中长度为1的通路总数,而为D中环的个数,即D中长度为1的回路总数。
D中长度大于等于2的通路数和回路数应如何计算呢,为此,先讨论长度等于2的通路数和回路数。
在图D中,从顶点到顶点的长度等于2的通路,中间必经过一顶点。
对于任意的k,若有通路,必有且,即。
反之,若D中不存在通路,必有或,即。
于是在图D中从顶点到顶点的长度等于2的通路数为:由矩阵的乘法规则知,正好是矩阵中的第i行与第j列元素,记,即就是从顶点到顶点的长度等于2的通路数,时,表示从顶点到顶点的长度等于2的回路数。
因此,即矩阵中所有元素的和为长度等于2的通路总数(含回路),其中对角线的元素和为长度等于2的回路总数。
根据以上分析,则有下面的推论。
定义有向图,,D中长度为的通路数和回路数可以用矩阵(简记)来表示,这里,其中,即则为顶点到顶点长度为的通路数,为到自身长度为的回路数。
中所有元素之和为D中长度为的通路数,而中对角线上元素之和为D中始于(终于)各顶点的长度为的回路数。
在图7.12中,计算,,如下:观察各矩阵发现,,,。
于是,D中到长度为,2的通路有3条,长度为3的通路有4条,长度为4的通路有6条。
由,可知,D中到自身长度为的回路各有1条(此时回路为复杂的)。
由于,所以D中长度为2的通路总数为10,其中有3条回路。
从上述分析,可得下面定理。
定理7.5 设为有向图D的邻接矩阵,,则中元素为到长度为的通路数,为D中长度为的通路总数,其中为D中长度为的回路总数。
若再令矩阵,,……,上面定理有下面推论。
推论设,则中元素为D中到长度小于等于的通路数,为D中长度小于等于的通路总数,其中为D中长度小于等于的回路总数。
数据结构课程设计-图的邻接矩阵

数据结构课程设计报告设计题目:图的邻接矩阵存储结构院系计算机学院年级x 级学生xxxx学号xxxxxxxxxx指导教师xxxxxxxxx起止时间10-6/10-102013年10月10日目录1 需求分析 (3)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 删除操作 (10)3.8 求顶点的度操作 (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描述。
然后是详细设计,描述实现概要设计中定义的基本功操作和所有数据类型,以及函数的功能及代码实现。
再次是对系统的调试分析说明,以及遇到的问题和解决问题的方法。
然后是用户使用说明书的阐述,然后是测试的数据和结果的分析,最后是对本次课程设计的结论。
图基本算法图的表示方法邻接矩阵邻接表

图基本算法图的表⽰⽅法邻接矩阵邻接表 要表⽰⼀个图G=(V,E),有两种标准的表⽰⽅法,即邻接表和邻接矩阵。
这两种表⽰法既可⽤于有向图,也可⽤于⽆向图。
通常采⽤邻接表表⽰法,因为⽤这种⽅法表⽰稀疏图(图中边数远⼩于点个数)⽐较紧凑。
但当遇到稠密图(|E|接近于|V|^2)或必须很快判别两个给定顶点⼿否存在连接边时,通常采⽤邻接矩阵表⽰法,例如求最短路径算法中,就采⽤邻接矩阵表⽰。
图G=<V,E>的邻接表表⽰是由⼀个包含|V|个列表的数组Adj所组成,其中每个列表对应于V中的⼀个顶点。
对于每⼀个u∈V,邻接表Adj[u]包含所有满⾜条件(u,v)∈E的顶点v。
亦即,Adj[u]包含图G中所有和顶点u相邻的顶点。
每个邻接表中的顶点⼀般以任意顺序存储。
如果G是⼀个有向图,则所有邻接表的长度之和为|E|,这是因为⼀条形如(u,v)的边是通过让v出现在Adj[u]中来表⽰的。
如果G是⼀个⽆向图,则所有邻接表的长度之和为2|E|,因为如果(u,v)是⼀条⽆向边,那么u会出现在v的邻接表中,反之亦然。
邻接表需要的存储空间为O(V+E)。
邻接表稍作变动,即可⽤来表⽰加权图,即每条边都有着相应权值的图,权值通常由加权函数w:E→R给出。
例如,设G=<V,E>是⼀个加权函数为w的加权图。
对每⼀条边(u,v)∈E,权值w(u,v)和顶点v⼀起存储在u的邻接表中。
邻接表C++实现:1 #include <iostream>2 #include <cstdio>3using namespace std;45#define maxn 100 //最⼤顶点个数6int n, m; //顶点数,边数78struct arcnode //边结点9 {10int vertex; //与表头结点相邻的顶点编号11int weight = 0; //连接两顶点的边的权值12 arcnode * next; //指向下⼀相邻接点13 arcnode() {}14 arcnode(int v,int w):vertex(v),weight(w),next(NULL) {}15 arcnode(int v):vertex(v),next(NULL) {}16 };1718struct vernode //顶点结点,为每⼀条邻接表的表头结点19 {20int vex; //当前定点编号21 arcnode * firarc; //与该顶点相连的第⼀个顶点组成的边22 }Ver[maxn];2324void Init() //建⽴图的邻接表需要先初始化,建⽴顶点结点25 {26for(int i = 1; i <= n; i++)27 {28 Ver[i].vex = i;29 Ver[i].firarc = NULL;30 }31 }3233void Insert(int a, int b, int w) //尾插法,插⼊以a为起点,b为终点,权为w的边,效率不如头插,但是可以去重边34 {35 arcnode * q = new arcnode(b, w);36if(Ver[a].firarc == NULL)37 Ver[a].firarc = q;38else39 {40 arcnode * p = Ver[a].firarc;41if(p->vertex == b) //如果不要去重边,去掉这⼀段42 {43if(p->weight < w)44 p->weight = w;45return ;46 }47while(p->next != NULL)48 {49if(p->next->vertex == b) //如果不要去重边,去掉这⼀段50 {51if(p->next->weight < w);52 p->next->weight = w;53return ;54 }55 p = p->next;56 }57 p->next = q;58 }59 }60void Insert2(int a, int b, int w) //头插法,效率更⾼,但不能去重边61 {62 arcnode * q = new arcnode(b, w);63if(Ver[a].firarc == NULL)64 Ver[a].firarc = q;65else66 {67 arcnode * p = Ver[a].firarc;68 q->next = p;69 Ver[a].firarc = q;70 }71 }7273void Insert(int a, int b) //尾插法,插⼊以a为起点,b为终点,⽆权的边,效率不如头插,但是可以去重边74 {75 arcnode * q = new arcnode(b);76if(Ver[a].firarc == NULL)77 Ver[a].firarc = q;78else79 {80 arcnode * p = Ver[a].firarc;81if(p->vertex == b) return; //去重边,如果不要去重边,去掉这⼀句82while(p->next != NULL)83 {84if(p->next->vertex == b) //去重边,如果不要去重边,去掉这⼀句85return;86 p = p->next;87 }88 p->next = q;89 }90 }91void Insert2(int a, int b) //头插法,效率跟⾼,但不能去重边92 {93 arcnode * q = new arcnode(b);94if(Ver[a].firarc == NULL)95 Ver[a].firarc = q;96else97 {98 arcnode * p = Ver[a].firarc;99 q->next = p;100 Ver[a].firarc = q;101 }102 }103void Delete(int a, int b) //删除以a为起点,b为终点的边104 {105 arcnode * p = Ver[a].firarc;106if(p->vertex == b)107 {108 Ver[a].firarc = p->next;109 delete p;110return ;111 }112while(p->next != NULL)113if(p->next->vertex == b)114 {115 p->next = p->next->next;116 delete p->next;117return ;118 }119 }120121void Show() //打印图的邻接表(有权值)122 {123for(int i = 1; i <= n; i++)124 {125 cout << Ver[i].vex;126 arcnode * p = Ver[i].firarc;127while(p != NULL)128 {129 cout << "->(" << p->vertex << "," << p->weight << ")";130 p = p->next;131 }132 cout << "->NULL" << endl;133 }134 }135136void Show2() //打印图的邻接表(⽆权值)137 {138for(int i = 1; i <= n; i++)140 cout << Ver[i].vex;141 arcnode * p = Ver[i].firarc;142while(p != NULL)143 {144 cout << "->" << p->vertex;145 p = p->next;146 }147 cout << "->NULL" << endl;148 }149 }150int main()151 {152int a, b, w;153 cout << "Enter n and m:";154 cin >> n >> m;155 Init();156while(m--)157 {158 cin >> a >> b >> w; //输⼊起点、终点159 Insert(a, b, w); //插⼊操作160 Insert(b, a, w); //如果是⽆向图还需要反向插⼊161 }162 Show();163return0;164 }View Code 邻接表表⽰法也有潜在的不⾜之处,即如果要确定图中边(u,v)是否存在,只能在顶点u邻接表Adj[u]中搜索v,除此之外没有其他更快的办法。
数据结构与算法课程设计报告---图的算法实现

数据结构与算法课程设计报告课程设计题目:图的算法实现专业班级:信息与计算科学1002班目录摘要 (1)1、引言 (1)2、需求分析 (1)3、概要设计 (2)4、详细设计 (4)5、程序设计 (10)6、运行结果 (18)7、总结体会 (19)摘要(题目): 图的算法实现实验内容图的算法实现问题描述:(1)将图的信息建立文件;(2)从文件读入图的信息,建立邻接矩阵和邻接表;(3)实现Prim、Kruskal、Dijkstra和拓扑排序算法。
关键字:邻接矩阵、Dijkstra和拓扑排序算法1.引言本次数据结构课程设计共完成图的存储结构的建立、Prim、Kruskal、Dijkstra 和拓扑排序算法等问题。
通过本次课程设计,可以巩固和加深对数据结构的理解,通过上机和程序调试,加深对课本知识的理解和熟练实践操作。
(1)通过本课程的学习,能够熟练掌握数据结构中图的几种基本操作;(2)能针对给定题目,选择相应的数据结构,分析并设计算法,进而给出问题的正确求解过程并编写代码实现。
使用语言:CPrim算法思想:从连通网N={V,E}中的某一顶点v0出发,选择与它关联的具有最小权值的边(v0,v),将其顶点加入到生成树的顶点集合V中。
以后每一步从一个顶点在V中,而另一个顶点不在V中的各条边中选择权值最小的边(u,v),把它的顶点加入到集合V中。
如此继续下去,直到网中的所有顶点都加入到生成树顶点集合V中为止。
拓扑排序算法思想:1、从有向图中选取一个没有前驱的顶点,并输出之;2、从有向图中删去此顶点以及所有以它为尾的弧;重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。
没有前驱-- 入度为零,删除顶点及以它为尾的弧-- 弧头顶点的入度减1。
2.需求分析1、通过键盘输入建立一个新的有向带权图,建立相应的文件;2、对建立的有向带权图进行处理,要求具有如下功能:(1)用邻接矩阵和邻接表的存储结构输出该有向带权图,并生成相应的输出结果;(2)用Prim、Kruskal算法实现对图的最小生成树的求解,并输出相应的输出结果;(3)用Dijkstra算法实现对图中从某个源点到其余各顶点的最短路径的求解,并输出相应的输出结果;(4)实现该图的拓扑排序算法。
邻接矩阵符号

邻接矩阵符号邻接矩阵是图论中一种常见的数据结构,用于表示图中的节点之间的连接关系。
在邻接矩阵中,使用特定的符号来表示节点之间的连接状态,这些符号具有特定的含义和规定。
一、邻接矩阵简介邻接矩阵是一个二维矩阵,矩阵的行数和列数分别对应图中节点的个数。
矩阵中的元素表示节点之间的连接关系,常用的符号有以下几种:1. "1":表示两个节点之间存在连接关系;2. "0":表示两个节点之间不存在连接关系;3. "∞":表示节点自身,即对角线上的元素,表示该节点与自身的连接关系,在一些算法中也用其他符号代替,如"X";4. "-":表示不允许直接连接。
二、邻接矩阵符号的应用场景邻接矩阵符号在图论中有着广泛的应用,常见的应用场景包括:1. 图的表示:邻接矩阵符号可以清晰地表示图中节点之间的连接关系,帮助我们理解和分析图的结构特征;2. 最短路径算法:在一些最短路径算法中,我们需要使用特定的符号来表示不可达的节点之间的距离,邻接矩阵符号可以帮助我们直观地进行计算和分析;3. 网络拓扑分析:在计算机网络领域,邻接矩阵符号被广泛应用于网络拓扑分析和路由算法中,帮助我们评估网络中节点之间的连接质量和距离。
三、邻接矩阵符号的举例为了更好地理解邻接矩阵符号的应用,我们以一个简单的图为例进行说明。
假设我们有一个有向图,有四个节点A、B、C和D。
以下是这个图的邻接矩阵表示:A B C DA 0 1 0 1B 1 0 1 0C 1 1 0 0D 0 1 1 0在上述邻接矩阵中,"1"表示两个节点之间存在连接关系,"0"表示两个节点之间不存在连接关系。
根据上述邻接矩阵,我们可以得出以下结论:1. 节点A与节点B、D存在连接关系,而与节点C不存在连接关系;2. 节点B与节点A、C存在连接关系,而与节点D不存在连接关系;3. 节点C与节点A、B存在连接关系,而与节点D不存在连接关系;4. 节点D与节点B、C存在连接关系,而与节点A不存在连接关系。
数据结构教学设计教案

数据结构教学设计教案教学设计教案:数据结构一、教学目标本教学设计旨在匡助学生掌握数据结构的基本概念、常用数据结构的特点和应用,培养学生的抽象思维能力和问题解决能力,提高学生的编程能力和算法设计能力。
二、教学内容1. 数据结构的基本概念- 数据结构的定义和分类- 数据结构的基本操作和特性- 数据结构的存储方式和表示方法2. 常用数据结构- 线性结构:数组、链表、栈、队列- 树形结构:二叉树、堆、哈夫曼树- 图形结构:图、邻接矩阵、邻接表3. 数据结构的应用- 查找算法:顺序查找、二分查找、哈希查找- 排序算法:冒泡排序、插入排序、快速排序- 图算法:最短路径、最小生成树三、教学方法1. 讲授法:通过教师讲解的方式,介绍数据结构的基本概念、常用数据结构和应用。
2. 实例演示法:通过实际案例演示,展示数据结构的操作和应用。
3. 问题解决法:引导学生通过解决问题的方式,巩固和应用所学的数据结构知识。
四、教学步骤1. 导入环节- 引入数据结构的概念,让学生了解数据结构在计算机科学中的重要性和应用场景。
- 激发学生的学习兴趣,提出问题引起思量,如“如何高效地查找一个元素?”、“如何对一组数据进行排序?”等。
2. 知识讲解- 介绍数据结构的基本概念,包括定义、分类和基本操作。
- 详细讲解线性结构、树形结构和图形结构的特点和应用。
- 介绍常用的查找算法、排序算法和图算法的原理和实现方法。
3. 实例演示- 通过具体案例演示,展示线性结构、树形结构和图形结构的操作和应用。
- 演示不同查找算法、排序算法和图算法的实际应用场景和效果。
4. 问题解决- 提供一些问题,让学生运用所学的数据结构知识进行解答。
- 引导学生思量如何选择合适的数据结构和算法,解决实际问题。
5. 总结与拓展- 总结本节课所学的数据结构知识和应用。
- 引导学生思量数据结构的发展趋势和未来应用前景。
五、教学评价1. 学生作业:布置相关作业,要求学生编写代码实现某些数据结构和算法,并进行测试和分析。
数据结构实验课教案

数据结构实验课教案一、实验目的与要求1. 实验目的(1) 掌握数据结构的基本概念和算法。
(2) 培养实际操作能力,巩固课堂所学知识。
(3) 提高编程技能,为实际项目开发打下基础。
2. 实验要求(1) 严格按照实验指导书进行实验。
(2) 实验前认真预习,充分理解实验内容。
(3) 实验过程中积极思考,遇到问题及时解决。
(4) 按时完成实验,积极参与讨论与交流。
二、实验环境与工具1. 实验环境(1) 操作系统:Windows 7/8/10或Linux。
(2) 编程语言:C/C++、Java或Python。
(3) 开发工具:Visual Studio、Eclipse、IntelliJ IDEA或PyCharm。
2. 实验工具(1) 文本编辑器或集成开发环境(IDE)。
(2) 版本控制系统(如Git)。
(3) 在线编程平台(如LeetCode、牛客网)。
三、实验内容与安排1. 实验一:线性表的基本操作(1) 实现线性表的顺序存储结构。
(2) 实现线性表的插入、删除、查找等基本操作。
(3) 分析线性表的时间复杂度。
2. 实验二:栈与队列的基本操作(1) 实现栈的顺序存储结构。
(2) 实现队列的顺序存储结构。
(3) 实现栈与队列的进栈、出栈、入队、出队等基本操作。
(4) 分析栈与队列的时间复杂度。
3. 实验三:线性表的链式存储结构(1) 实现单链表的结构。
(2) 实现单链表的插入、删除、查找等基本操作。
(3) 分析单链表的时间复杂度。
4. 实验四:树与二叉树的基本操作(1) 实现二叉树的结构。
(2) 实现二叉树的遍历(前序、中序、后序)。
(3) 实现二叉搜索树的基本操作。
(4) 分析树与二叉树的时间复杂度。
5. 实验五:图的基本操作(1) 实现图的邻接矩阵存储结构。
(2) 实现图的邻接表存储结构。
(3) 实现图的深度优先搜索(DFS)和广度优先搜索(BFS)。
(4) 分析图的时间复杂度。
四、实验评价与成绩评定1. 实验评价(1) 代码质量:代码规范、注释清晰、易于维护。
邻接矩阵和邻接表

邻接矩阵和邻接表邻接矩阵与邻接表都是建立在图结构中的逻辑关系,用于存储图中相邻节点之间的连接关系,是用来表示网络的重要的数据结构,大量应用于无权图或带权图的表示、存储和操作。
一、邻接矩阵1.概念:邻接矩阵(Adjacency Matrix)是一种用来存储图G中顶点之间的关系的结构,它是由一个二维数组来表示的,数组中的每一行和每一列都代表一个顶点,而数组元素之间的值有一定含义,这些值代表了两个顶点之间是否存在连接,也就是说,只有存在边才能够表示值,否则以无穷大表示。
2.特点:(1)存储空间大:邻接矩阵是一个矩形数组,其中的每一行和每一列都代表一个顶点,那么它所占用的空间一定是与节点的度数有关的,因此在稀疏图结构中使用邻接矩阵对空间也会非常消耗;(2)查找方便:邻接矩阵存储的是节点两两之间的连接关系,只要矩阵中相应位置上的值不为无穷大,就能判断这两个节点之间是否存在连接,因此在查找图中某两节点之间连接关系的时候,邻接矩阵的效率会比较高。
二、邻接表1.概念:邻接表也是一种非常常用的表示图的数据结构,它采用的是链表的形式来存储顶点的相邻的结点的关系,也就是说,每个顶点都会有一个链表来存储它周围的结点。
它能够比较好的展示出图中各个顶点之间的关系,以及图中结点的孤立情况。
2.特点:(1)存储空间小:由于邻接表使用链表的方式存储节点,它可以精确的表示两个节点的距离,而非像邻接矩阵一样,数组中的每一行和每一列都代表一个节点,因此,它所占用的空间会比邻接矩阵小些,在内存空间中有比较大的空间优势;(2)查找速度略低:虽然邻接表能精确的表示两个节点之间的距离,而且只需要占用少量内存,但是查找两点之间连接关系所花费的时间会略大于邻接矩阵。
邻接矩阵的定义

邻接矩阵的定义邻接矩阵是图论中一种常用的数据结构,用于表示图的连接关系。
它是一个二维矩阵,其中矩阵的行和列分别代表图中的节点,矩阵中的元素表示节点之间的连接关系。
在邻接矩阵中,如果两个节点之间存在连接,则对应的矩阵元素为1;如果两个节点之间不存在连接,则对应的矩阵元素为0。
对于无向图来说,邻接矩阵是对称的,即矩阵的行和列之间的元素是相等的;而对于有向图来说,邻接矩阵不一定是对称的。
邻接矩阵的优点是可以方便地表示图中节点之间的连接关系,并且可以通过简单的查表操作来判断两个节点之间是否存在连接。
此外,邻接矩阵还可以用于实现一些基本的图算法,例如深度优先搜索和广度优先搜索。
然而,邻接矩阵也存在一些缺点。
首先,邻接矩阵的大小取决于图中节点的数量,当节点数量较大时,矩阵的存储空间会变得很大。
其次,邻接矩阵的构建和修改操作需要消耗较多的时间和空间。
因此,在实际应用中,需要根据具体的问题场景来选择合适的数据结构。
邻接矩阵的应用非常广泛。
在社交网络分析中,可以使用邻接矩阵来表示用户之间的关注关系;在交通网络中,可以使用邻接矩阵来表示道路之间的连接关系;在电力网络中,可以使用邻接矩阵来表示电网中的节点和线路之间的连接关系。
除了使用矩阵来表示图的连接关系之外,还可以使用邻接表、关联矩阵等数据结构。
邻接表是一种更加灵活的数据结构,它通过链表的方式来表示图中节点之间的连接关系。
关联矩阵是一种特殊的邻接矩阵,它将节点和连接关系分别用矩阵的行和列来表示。
邻接矩阵是一种常用的图表示方法,它可以方便地表示图中节点之间的连接关系,并且可以用于实现一些基本的图算法。
但是,在选择图表示方法时,需要根据具体的问题场景来选择合适的数据结构,以取得更好的性能和效果。
图的邻接矩阵

图的邻接矩阵1. 图的邻接矩阵(Adjacency Matrix)存储表示法设图 A = (V, E)是一个有 n 个顶点的图, 图的邻接矩阵是一个二维数组A.edge[n][n],用来存放顶点的信息和边或弧的信息。
定义为:(1) 无向图的邻接矩阵是对称的;有向图的邻接矩阵可能是不对称的。
(2) 在有向图中, 统计第 i 行 1 的个数可得顶点 i 的出度,统计第 j 行 1 的个数可得顶点j 的入度。
在无向图中, 统计第 i 行 (列) 1 的个数可得顶点i 的度。
图的邻接矩阵存储表示:#define INFINITY INT_MAX // 最大值?#define MAX_VERTEX_NUM 20 // 最大顶点个数typedef enum {DG, DN, AG, AN} GraphKind; //{有向图,有向网,无向图,无向网}typedef struct ArcCell {VRType adj; // VRType是顶点关系类型。
对无权图,用1或0表示相邻否;// 对带权图,则为权值类型。
InfoType *info; // 该弧相关信息的指针} ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct {VertexType vexs[MAX_VERTEX_NUM]; // 顶点向量AdjMatrix arcs; // 邻接矩阵int vexnum, arcnum; // 图的当前顶点数和弧(边)数GraphKind kind; // 图的种类标志} MGraph;构造一个具有n个顶点和e条边的无向网的时间复杂度为O(n2+e*n),其中O(n2)用于对邻接矩阵初始化。
2.图的邻接表(Adjacency List)存储表示法邻接表是图的一种链式存储结构,它对图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点vi的边(对有向图是以顶点vi为尾的弧),每个结点由三个域组成:邻接点域(adjvex)指示与顶点vi邻接的点在图中的位置,链域(nextarc)指示下一条边或弧的结点,数据域(info)存储和边或弧相关的信息(如权值)。
数据结构课程设计报告地图着色问题

数据结构课程设计报告地图着色问题地图着色问题是一个经典的图论问题,涉及到如何用最少的颜色给地图上的各个区域进行着色,使得相邻的区域颜色不同。
在数据结构课程设计报告中,我们将详细介绍地图着色问题的定义、解决方法以及实现过程。
一、问题定义地图着色问题可以用图论的方式来描述。
给定一个地图,地图上的每个区域可以看作图的一个顶点,而区域之间的邻接关系可以看作图的边。
问题的目标是找到一种着色方案,使得相邻的区域颜色不同,且使用的颜色数最少。
二、解决方法1. 贪心算法:贪心算法是一种简单而有效的解决地图着色问题的方法。
具体步骤如下:a. 选择一个未着色的区域。
b. 遍历该区域的所有邻接区域,记录已经使用的颜色。
c. 选择一个未使用的颜色,给该区域着色。
d. 重复步骤a-c,直到所有区域都被着色。
2. 回溯算法:回溯算法是一种穷举所有可能解的方法,通过逐步试错来找到最优解。
具体步骤如下:a. 选择一个未着色的区域。
b. 遍历所有可用的颜色,尝试给该区域着色。
c. 检查该区域与相邻区域的颜色是否冲突,如果冲突则回溯到上一步。
d. 重复步骤a-c,直到所有区域都被着色。
三、实现过程1. 数据结构设计:在解决地图着色问题时,我们可以使用图的邻接矩阵或邻接表来表示地图的结构。
邻接矩阵适用于稠密图,而邻接表适用于稀疏图。
此外,我们还需要使用一个数组来记录每个区域的颜色。
2. 算法实现:根据选择的解决方法,我们可以实现相应的算法来解决地图着色问题。
对于贪心算法,我们可以按照贪心的策略来选择颜色;对于回溯算法,我们可以使用递归来穷举所有可能的解。
3. 算法优化:地图着色问题属于NP完全问题,因此在实际应用中,对于大规模的地图,穷举所有可能的解是不可行的。
我们可以通过一些优化策略来提高算法的效率,如剪枝、启发式搜索等。
四、实例分析假设我们有一个地图,包含5个区域,相邻区域如下所示:区域1:区域2、区域3区域2:区域1、区域3、区域4区域3:区域1、区域2、区域4、区域5区域4:区域2、区域3、区域5区域5:区域3、区域4我们可以使用贪心算法来解决这个问题。
shuju文档

数据结构课程设计题目,图的建立以及遍历。
2011-1-17 14:47提问者:doraprince|悬赏分:50 |浏览次数:1134次*问题描述:要求建立一个菜单,菜单包含4个菜单项供选择:1、建立图的邻接矩阵;2、建立图的邻接表;3、对图进行深度优先遍历;4、对图进行广度优先遍历。
要求从键盘输入无向有权图的顶点数、边数、每条边的起始顶点序号、终点序号、权值,将每条边的信息存入到邻接矩阵和邻接表中。
从键盘输入深度优先遍历和广度优先遍历图时初始出发的顶点的序号,要求在遍历过程中输出访问过的结点序号。
请用C语言编写,要求在TURBO C2.0下测试通过。
2011-1-23 13:33最佳答案//图的遍历算法程序//图的遍历是指按某条搜索路径访问图中每个结点,使得每个结点均被访问一次,而且仅被访问一次。
图的遍历有深度遍历算法和广度遍历算法,程序如下:#include <iostream>//#include <malloc.h>#define INFINITY 32767#define MAX_VEX 20 //最大顶点个数#define QUEUE_SIZE (MAX_VEX+1) //队列长度using namespace std;bool *visited; //访问标志数组//图的邻接矩阵存储结构typedef struct{char *vexs; //顶点向量int arcs[MAX_VEX][MAX_VEX]; //邻接矩阵int vexnum,arcnum; //图的当前顶点数和弧数}Graph;//队列类class Queue{public:void InitQueue(){base=(int *)malloc(QUEUE_SIZE*sizeof(int));front=rear=0;}void EnQueue(int e){base[rear]=e;rear=(rear+1)%QUEUE_SIZE;}void DeQueue(int &e){e=base[front];front=(front+1)%QUEUE_SIZE;}public:int *base;int front;int rear;};//图G中查找元素c的位置int Locate(Graph G,char c){for(int i=0;i<G.vexnum;i++)if(G.vexs[i]==c) return i;return -1;}//创建无向网void CreateUDN(Graph &G){int i,j,w,s1,s2;char a,b,temp;printf("输入顶点数和弧数:");scanf("%d%d",&G.vexnum,&G.arcnum);temp=getchar(); //接收回车G.vexs=(char *)malloc(G.vexnum*sizeof(char)); //分配顶点数目printf("输入%d个顶点.\n",G.vexnum);for(i=0;i<G.vexnum;i++){ //初始化顶点printf("输入顶点%d:",i);scanf("%c",&G.vexs[i]);temp=getchar(); //接收回车}for(i=0;i<G.vexnum;i++) //初始化邻接矩阵for(j=0;j<G.vexnum;j++)G.arcs[i][j]=INFINITY;printf("输入%d条弧.\n",G.arcnum);for(i=0;i<G.arcnum;i++){ //初始化弧printf("输入弧%d:",i);scanf("%c %c %d",&a,&b,&w); //输入一条边依附的顶点和权值temp=getchar(); //接收回车s1=Locate(G,a);s2=Locate(G,b);G.arcs[s1][s2]=G.arcs[s2][s1]=w;}}//图G中顶点k的第一个邻接顶点int FirstVex(Graph G,int k){if(k>=0 && k<G.vexnum){ //k合理for(int i=0;i<G.vexnum;i++)if(G.arcs[k][i]!=INFINITY) return i;}return -1;}//图G中顶点i的第j个邻接顶点的下一个邻接顶点int NextVex(Graph G,int i,int j){if(i>=0 && i<G.vexnum && j>=0 && j<G.vexnum){ //i,j合理for(int k=j+1;k<G.vexnum;k++)if(G.arcs[i][k]!=INFINITY) return k;}return -1;}//深度优先遍历void DFS(Graph G,int k){int i;if(k==-1){ //第一次执行DFS时,k为-1for(i=0;i<G.vexnum;i++)if(!visited[i]) DFS(G,i); //对尚未访问的顶点调用DFS}else{visited[k]=true;printf("%c ",G.vexs[k]); //访问第k个顶点for(i=FirstVex(G,k);i>=0;i=NextVex(G,k,i))if(!visited[i]) DFS(G,i); //对k的尚未访问的邻接顶点i递归调用DFS }}//广度优先遍历void BFS(Graph G){int k;Queue Q; //辅助队列QQ.InitQueue();for(int i=0;i<G.vexnum;i++)if(!visited[i]){ //i尚未访问visited[i]=true;printf("%c ",G.vexs[i]);Q.EnQueue(i); //i入列while(Q.front!=Q.rear){Q.DeQueue(k); //队头元素出列并置为kfor(int w=FirstVex(G,k);w>=0;w=NextVex(G,k,w))if(!visited[w]){ //w为k的尚未访问的邻接顶点visited[w]=true;printf("%c ",G.vexs[w]);Q.EnQueue(w);}}}}//主函数void main(){int i;Graph G;CreateUDN(G);visited=(bool *)malloc(G.vexnum*sizeof(bool));printf("\n广度优先遍历: ");for(i=0;i<G.vexnum;i++)visited[i]=false;DFS(G,-1);printf("\n深度优先遍历: ");for(i=0;i<G.vexnum;i++)visited[i]=false;BFS(G);printf("\n程序结束.\n");}输出结果为(红色为键盘输入的数据,权值都置为1):输入顶点数和弧数:8 9输入8个顶点.输入顶点0:a输入顶点1:b输入顶点2:c输入顶点3:d输入顶点4:e输入顶点5:f输入顶点6:g输入顶点7:h输入9条弧.输入弧0:a b 1输入弧1:b d 1输入弧2:b e 1输入弧3:d h 1输入弧4:e h 1输入弧5:a c 1输入弧6:c f 1输入弧7:c g 1输入弧8:f g 1广度优先遍历: a b d h e c f g 深度优先遍历: a b c d e f g h 程序结束.只能劝之为1。
邻接矩阵的课程设计

邻接矩阵的课程设计一、教学目标本节课的教学目标是让学生掌握邻接矩阵的概念、性质及其在图的表示中的应用。
具体来说,知识目标包括:1.理解邻接矩阵的定义和性质。
2.掌握邻接矩阵在图的表示中的应用。
技能目标包括:1.能够熟练地运用邻接矩阵表示图。
2.能够运用邻接矩阵解决图的一些基本问题。
情感态度价值观目标包括:1.培养学生对图论的兴趣,使其能够主动学习图论的相关知识。
2.培养学生团队合作的精神,使其在解决问题时能够与他人共同探讨。
二、教学内容本节课的教学内容主要包括邻接矩阵的定义、性质及其在图的表示中的应用。
具体安排如下:1.引入邻接矩阵的概念,解释其定义和性质。
2.讲解邻接矩阵在图的表示中的应用,例如判断两顶点是否相邻、查找顶点的度等。
3.通过例题和练习题,让学生巩固邻接矩阵的概念和应用。
三、教学方法为了激发学生的学习兴趣和主动性,本节课将采用多种教学方法,如讲授法、讨论法、案例分析法等。
具体安排如下:1.通过讲授法,讲解邻接矩阵的定义、性质和应用。
2.采用讨论法,让学生分组讨论邻接矩阵在图的表示中的应用,促进学生之间的交流。
3.通过案例分析法,分析实际问题,让学生学会将邻接矩阵应用于解决实际问题。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:邻接矩阵的相关内容。
2.参考书:图论、线性代数等相关书籍。
3.多媒体资料:PPT、动画等辅助教学材料。
4.实验设备:计算机、投影仪等。
通过以上教学资源,我们将帮助学生更好地理解和掌握邻接矩阵的知识,提高他们解决实际问题的能力。
五、教学评估为了全面、客观地评估学生的学习成果,我们将采用多种评估方式,包括平时表现、作业和考试等。
具体安排如下:1.平时表现:通过观察学生在课堂上的参与程度、提问回答等情况,评估他们的学习态度和理解程度。
2.作业:布置与邻接矩阵相关的练习题,评估学生对知识的掌握程度。
3.考试:设计涵盖邻接矩阵概念、性质和应用的试题,评估学生的综合运用能力。
数据结构实验 图的邻接表和邻接矩阵操作

p->weight=weight; p->nextarc=G.vertices[vv].firstarc; G.vertices[vv].firstarc=p; strcmp(G.vertices[vv].data,v);
q=(ArcNode *)malloc(sizeof(ArcNode)); q->adjvex=vv; q->weight=weight; q->nextarc=G.vertices[ww].firstarc; G.vertices[ww].firstarc=q; strcmp(G.vertices[ww].data,w);
实验报告 6
课程 数据结构 实验名称 图的建立及遍历
第页
专业
班级_ __ 学号_ ___ 姓名
实验日期: 2010 年 11 月 23 日
评分
一 、实验目的
1.学会用邻接矩阵和邻接表实现图结构和对图的基本操作。 2.掌握对图操作的具体实现; 3. 掌握图的两种遍历算法(深度优先、广度优先); 4、掌握求图的最小生成树和顶点间最短路径的算法;
int adjvex;//该弧指向的顶点的位置 ArcType weight; struct ArcNode *nextarc;//指向下一条弧指针 //InfoType *info;该弧相关信息的指针 }ArcNode; typedef struct VNode { VertexType data;//顶点信息 ArcNode *firstarc;//指向第一条依附该顶点的弧的指针 }VNode,AdjList[MAX_VEX_NUM]; typedef struct { AdjList vertices; int vexnum,arcnum; GraphKind kind; }ALGraph; ALGraph G; struct MiniSpanTree_Flag { VertexType adjvex; ArcType lowcost; }closedge[MAX_VEX_NUM]; typedef bool PathMatrix[MAX_VEX_NUM][MAX_VEX_NUM];
数据结构课程设计分类题目 (1)

(1)确定在序列中比正整数x大的数有几个(相同的数只计算一次,如序列{20,20,17,16,15,15,11,10,8,7,7,5,4}中比10大的数有5个);
13、设有一个由正整数组成的无序单链表,编写完成下列功能的算法:
(1)找出最小值结点,且打印该数值;
(2)若该数值是奇数,则将其与直接后继结点的数值交换;
(3)若该数值是偶数,则将其直接后继结点删除。
14、在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素。例如:(7,10,10,21,30,42,42,42,51,70)将变作(7,10,21,30,42,51,70)。
printf(sum);}
树和二叉树
1、二叉树用二叉链表存储,写一个算法将二叉树中的叶子结点按从右至左的顺序建立一个单链表。
2、知二叉树用二叉链表存储,写出求二叉树宽度的算法。所谓宽度是指在二叉树的各层上,具有结点数最多的那一层上的结点总数。
3、叉树用二叉链表存储,写一个算法交换各结点的左右子树。
4、二叉树用二叉链表存储,若结点的左孩子的数据域的值大于右孩子数据域的值,则交换其左右子树。
19、试设计一个算法打印出由根结点出发到达叶结点的所有路径。
20、试写出算法,求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值。
21、给定一组项及其权值,假定项都存放于二叉树的树叶结点,则具有最小带权外部路径长度的树称为huffman 树。编写构造huffman 树 的算法。
22、已知一中序线索二叉树,写一算法完成对它的中序扫描。
邻接矩阵课课程设计

邻接矩阵课课程设计一、教学目标本课程的教学目标是使学生掌握邻接矩阵的概念、性质及其在图论中的应用。
通过本课程的学习,学生应能够:1.知识目标:a.理解图的基本概念及其表示方法。
b.掌握邻接矩阵的定义、性质和计算方法。
c.了解邻接矩阵在图的遍历、最短路径等算法中的应用。
2.技能目标:a.能够熟练地运用邻接矩阵表示图。
b.能够运用邻接矩阵进行图的遍历和最短路径计算。
c.能够运用邻接矩阵解决一些简单的图论问题。
3.情感态度价值观目标:a.培养学生的逻辑思维能力和问题解决能力。
b.培养学生的团队合作意识和交流沟通能力。
c.培养学生的创新精神和自主学习能力。
二、教学内容本课程的教学内容主要包括以下几个部分:1.图的基本概念及其表示方法。
a.图的定义和基本术语。
b.图的邻接表和邻接矩阵表示方法。
2.邻接矩阵的定义、性质和计算方法。
a.邻接矩阵的定义和性质。
b.邻接矩阵的计算方法。
3.邻接矩阵在图的遍历、最短路径等算法中的应用。
a.邻接矩阵的图的遍历算法。
b.邻接矩阵的最短路径算法。
三、教学方法为了实现本课程的教学目标,我们将采用以下教学方法:1.讲授法:通过讲解图的基本概念、邻接矩阵的定义和性质等理论知识,使学生掌握相关概念和理论。
2.案例分析法:通过分析一些具体的图论问题,引导学生运用邻接矩阵解决问题,培养学生的问题解决能力。
3.实验法:通过上机实验,让学生亲手编写代码,运用邻接矩阵进行图的遍历和最短路径计算,提高学生的实际操作能力。
四、教学资源为了支持本课程的教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:《图论及其应用》。
2.参考书:图论相关论文和教材。
3.多媒体资料:PPT课件、教学视频等。
4.实验设备:计算机、网络等。
五、教学评估为了全面、客观、公正地评估学生的学习成果,本课程将采用以下评估方式:1.平时表现:通过观察学生在课堂上的参与程度、提问回答、小组讨论等表现,评估学生的学习态度和理解能力。
数据结构与算法-图的邻接矩阵

数据结构与算法-图的邻接矩阵实验报告课程:数据结构与算法实验日期:实验名称:图的邻接矩阵一、实验目的掌握图的邻接矩阵二、实验内容必做部分1、给出图的邻接矩阵存储结构的类型定义。
2、实现LocateVex(G,v)操作函数:若找到顶点v,返回其在vexs 数组中的下标,否则返回-1。
3、实现算法7.2(构造无向网)。
Status CreateUDN(MGraph &G)4、设计并实现无向网的输出算法,要求能显示顶点以及顶点之间的邻接关系(方式自定)5、在主函数中调用CreateUDN创建一个无向网,并进行输出。
要求给出至少两组测试数据。
选做部分基于图的邻接矩阵存储结构(即MGraph类型)编写下述操作函数:1、求下标为v的顶点的第1个邻接点,返回该邻接点在顶点数组中的下标;若找不到这样的邻接点,返回-1。
int FirstAdjVex(MGraph G,int v)2、求下标为v的顶点相对于下标为w的顶点的下一个邻接点,返回该邻接点的下标;若找不到这样的邻接点,返回-1。
int NextAdjVex(MGraph G,int v,int w)在主函数调用上述函数,给出测试结果。
三、实验步骤必做部分1、给出图的邻接矩阵存储结构的类型定义。
2、实现LocateVex(G,v)操作函数:若找到顶点v,返回其在vexs 数组中的下标,否则返回-1。
3、实现算法7.2(构造无向网)。
Status CreateUDN(MGraph &G)4、设计并实现无向网的输出算法,要求能显示顶点以及顶点之间的邻接关系(方式自定)5、在主函数中调用CreateUDN创建一个无向网,并进行输出。
要求给出至少两组测试数据。
选做部分基于图的邻接矩阵存储结构(即MGraph类型)编写下述操作函数:1、求下标为v的顶点的第1个邻接点,返回该邻接点在顶点数组中的下标;若找不到这样的邻接点,返回-1。
int FirstAdjVex(MGraph G,int v)2、求下标为v的顶点相对于下标为w的顶点的下一个邻接点,返回该邻接点的下标;若找不到这样的邻接点,返回-1。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计报告设计题目:图的邻接矩阵存储结构院系计算机学院年级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。