数据结构实验四:图的应用

合集下载

数据结构实验———图实验报告

数据结构实验———图实验报告

数据结构实验报告目的要求1.掌握图的存储思想及其存储实现..2.掌握图的深度、广度优先遍历算法思想及其程序实现..3.掌握图的常见应用算法的思想及其程序实现..实验内容1.键盘输入数据;建立一个有向图的邻接表..2.输出该邻接表..3.在有向图的邻接表的基础上计算各顶点的度;并输出..4.以有向图的邻接表为基础实现输出它的拓扑排序序列..5.采用邻接表存储实现无向图的深度优先递归遍历..6.采用邻接表存储实现无向图的广度优先遍历..7.在主函数中设计一个简单的菜单;分别调试上述算法..源程序:主程序的头文件:队列#include <stdio.h>#include <stdlib.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef int QElemType;typedef struct QNode{ //队的操作QElemType data;struct QNode *next;}QNode;*QueuePtr;typedef struct {QueuePtr front;QueuePtr rear;}LinkQueue;void InitQueueLinkQueue &Q{ //初始化队列Q.front =Q.rear =QueuePtrmallocsizeofQNode;ifQ.front exitOVERFLOW; //存储分配失败Q.front ->next =NULL;}int EnQueueLinkQueue &Q;QElemType e //插入元素e为Q的新的队尾元素{QueuePtr p;p=QueuePtrmallocsizeofQNode;ifp exitOVERFLOW;p->data=e;p->next=NULL;Q.rear->next=p;Q.rear =p;return OK;}int DeQueueLinkQueue &Q;QElemType &e //删除Q的队头元素;用e返回其值{ ifQ.front ==Q.rear return ERROR;QueuePtr p;p=Q.front ->next;e=p->data;Q.front->next=p->next ;ifQ.rear==p Q.rear =Q.front ;freep;return OK;}主程序:#include <stdio.h>#include<stdlib.h>#include"duilie.h"#define TRUE 1#define FALSE 0#define Status int#define MAX_VERTEX_NUM 8 /*顶点最大个数*/#define VertexType char /*顶点元素类型*/enum BOOlean {False;True};BOOlean visitedMAX_VERTEX_NUM; //全局变量——访问标志数组typedef struct ArcNode{int adjvex;struct ArcNode *nextarc;int weight; /*边的权*/}ArcNode; /*表结点*/typedef struct VNode{ int degree;indegree;/*顶点的度;入度*/V ertexType data;ArcNode *firstarc;}VNode/*头结点*/;AdjListMAX_VERTEX_NUM;typedef struct{ AdjList vertices;int vexnum;arcnum;/*顶点的实际数;边的实际数*/}ALGraph;//建立图的邻接表void creat_linkALGraph *G{ int i;j;ArcNode *s;printf"请依次输入顶点数、边数:";scanf"%d%d";&G->vexnum;&G->arcnum;for i=0;i<G->vexnum;i++{ G->verticesi.data='A'+i;G->verticesi.firstarc=NULL;}for i=0;i<G->vexnum;{ printf"请输入顶点的数组坐标若退出;请输入-1:";scanf"%d";&i;ifi==-1 break;printf"请输入顶点所指向下一个顶点的数组坐标:";scanf"%d";&j;s=ArcNode *mallocsizeofArcNode;s->adjvex=j;s->nextarc=G->verticesi.firstarc;G->verticesi.firstarc=s;}}// 输出邻接表void visitALGraph G{ int i;ArcNode *p;printf"%4s%6s%18s\n";"NO";"data";"adjvexs of arcs";for i=0;i<G.vexnum;i++{printf"%4d%5c ";i;G.verticesi.data;forp=G.verticesi.firstarc;p;p=p->nextarcprintf"%3d";p->adjvex;printf"\n";}}// 计算各顶点的度及入度void cacuALGraph *G{ArcNode *p;int i;for i=0;i<G->vexnum;i++{G->verticesi.degree=0;G->verticesi.indegree=0;}//度与初度初始化为零for i=0;i<G->vexnum;i++forp=G->verticesi.firstarc;p;p=p->nextarc{G->verticesi.degree++;G->verticesp->adjvex.degree++;G->verticesp->adjvex.indegree++;}}void print_degreeALGraph G{int i;printf"\n Nom data degree indegree\n";for i=0;i<G.vexnum;i++printf"\n%4d%5c%7d%8d";i;G.verticesi.data;G.verticesi.degree;G.verticesi.indegree;printf"\n";}// 拓扑排序Status TopologiSortALGraph G{int i;count;top=0;stack50;ArcNode *p;cacu&G;print_degreeG;printf"\nTopologiSort is \n";fori=0;i<G.vexnum;i++ifG.verticesi.indegree stacktop++=i;count=0;whiletop=0{i=stack--top;if count==0 printf"%c";G.verticesi.data;else printf"-->%c";G.verticesi.data;count++;forp=G.verticesi.firstarc;p;p=p->nextarcif --G.verticesp->adjvex.indegreestacktop++=p->adjvex;}if count<G.vexnumreturnFALSE; else returnTRUE;}//在图G中寻找第v个顶点的第一个邻接顶点int FirstAdjVexALGraph G;int v{ifG.verticesv.firstarc return 0;else returnG.verticesv.firstarc->adjvex;}//在图G中寻找第v个顶点的相对于u的下一个邻接顶点int NextAdjVexALGraph G;int v;int u{ArcNode *p;p=G.verticesv.firstarc;whilep->adjvex=u p=p->nextarc; //在顶点v的弧链中找到顶点u ifp->nextarc==NULL return 0; //若已是最后一个顶点;返回0else returnp->nextarc->adjvex; //返回下一个邻接顶点的序号}//采用邻接表存储实现无向图的深度优先递归遍历void DFSALGraph G;int i{ int w;visitedi=True; //访问第i个顶点printf"%d->";i;forw=FirstAdjVexG;i;w;w=NextAdjVexG;i;wifvisitedw DFSG;w; //对尚未访问的邻接顶点w调用DFS}void DFSTraverseALGraph G{ int i;printf"DFSTraverse:";fori=0;i<G.vexnum;i++ visitedi=False; //访问标志数组初始化fori=0;i<G.vexnum;i++ifvisitedi DFSG;i; //对尚未访问的顶点调用DFS}//按广度优先非递归的遍历图G;使用辅助队列Q和访问标志数组visited void BFSTraverseALGraph G{int i;u;w;LinkQueue Q;printf"BFSTreverse:";fori=0;i<G.vexnum;i++ visitedi=False; //访问标志数组初始化InitQueueQ; //初始化队列fori=0;i<G.vexnum;i++ifvisitedi{visitedi=True; //访问顶点iprintf"%d->";i;EnQueueQ;i; //将序号i入队列whileQ.front ==Q.rear //若队列不空;继续{DeQueueQ;u; //将队头元素出队列并置为uforw=FirstAdjVexG;u;w;w=NextAdjV exG;u;wifvisitedw //对u的尚未访问的邻接顶点w进行访问并入队列{ visitedw=True;printf"%d->";w;EnQueueQ;w;}}}}void main{ALGraph G;int select;printf" 图的有关操作实验\n ";do{printf"\n1 创建一个有向图的邻接表 2 输出该邻接表\n";printf"3.输出该有向图的度和入度 4.输出该有向图拓扑排序序列\n";printf"5.创建一个无向图的邻接表 6.深度优先递归遍历该无向图\n";printf"7.广度优先遍历该无向图0.退出\n";printf"请输入选择:";scanf"%d";&select;switchselect{case 1:printf"\n创建一个有向图的邻接表:\n";creat_link&G;break;case 2:printf"\n输出该邻接表:\n";visitG;break;case 3:printf"\n输出该有向图的度和入度:\n";cacu&G;print_degreeG;break;case 4:printf"\n输出该有向图拓扑排序序列:\n";ifTopologiSortGprintf"Toposort is not success";break;case 5:printf"\n创建一个无向图的邻接表: \n";creat_link&G;break;case 6:printf"\n深度优先递归遍历该无向图: \n";DFSTraverseG;break;case 7:printf"\n广度优先遍历该无向图:\n";BFSTraverseG;break;case 0:break;default:printf"输入选项错误重新输入\n";}}whileselect;}运行结果截图:1.主菜单界面:2.创建一个有向图的领接表3.输出该邻接表4. 在有向图的邻接表的基础上计算各顶点的度;并输出..5. 输出它的拓扑排序序列6. 输出所建无向图的邻接表7. 深度优先递归遍历该无向图8. 广度优先遍历该无向图说明:本实验用的有向图是课本182页图7.28;无向图为课本168页图a实验总结这次的图的操作实验;与树的操作类似;但又比树复杂;包含更多的存储结构和遍历方法的操作;而且图的遍历需要沿着弧进行;以便输出弧上的信息..本实验中图的遍历采用邻接表的存储结构;在输入图的信息时;首先要画出图的邻接表信息..图有两种遍历的形式;一种为深度优先搜索;另一种为广度优先搜索..由于能力有限;没能实现图的深度非递归优先搜索;而是实现了图的深度递归优先搜索..本实验基本完成了图的操作;也学到了很多关于图的知识和算法..。

图的应用实验报告北华航天工业学院

图的应用实验报告北华航天工业学院

实验四图的应用(一)一.实验目的1.理解图的存储结构原理;2.掌握图的存储结构方法与实现;二.使用的设备和仪器计算机、Windows、Visual studio2012三.实验内容及要求1、以下是无向图,请利用邻接矩阵(数组法)实现图的存储与遍历。

四.实验步骤1、程序代码:#include<iostream>using namespace std;const int maxsize = 4;int visited[maxsize] = { 0 };class wxt{public:wxt(int a[], int n, int e);~wxt();void dftraverse(int v);void bftraverse(int v);private:int dian[maxsize];int bian[maxsize][maxsize];int d_num, b_num;};wxt::wxt(int a[], int n, int e){int i, j, k;d_num = n; b_num = e;for (i = 0; i < d_num; i++)dian[i] = a[i];for (i = 0; i < d_num; i++)for (j = 0; j < d_num; j++)bian[i][j] = 0;for (k = 0; k < b_num; k++){cin >> i >> j;bian[i][j] = 1; bian[j][i] = 1;}}wxt::~wxt(){}void wxt::dftraverse(int v){cout << dian[v]; visited[v] = 1;for (int j = 0; j < d_num; j++)if (bian[v][j] == 1 && visited[j] == 0)dftraverse(j);}void wxt::bftraverse(int v){int w, j, q[maxsize];int frout = -1, rear = -1;cout << dian[v]; visited[v] = 1;q[++rear] = v;while (frout != rear){w = q[++frout];for(j=0;j<d_num;j++)if (bian[w][j] == 1 && visited[j] == 0){cout << dian[j]; visited[j] = 1; q[++rear] = j;}}}int main(){int i;int m[] = { 10,20,15,30 };wxt t(m, 4, 4);for (i = 0; i < maxsize; i++)visited[i] = 0;cout <<"深度优先遍历序列是:"<<endl;t.dftraverse(0);cout << endl;for (i = 0; i < maxsize; i++)visited[i] = 0;cout <<"广度优先遍历序列是:"<<endl;t.bftraverse(0);cout << endl;return 0;}运行结果:五.实验总结理解了图的存储结构原理,掌握了图的存储结构方法与实现。

数据结构课程实验丨图的应用-通信网络

数据结构课程实验丨图的应用-通信网络

实验图的应用【问题描述】(CSP原题)某国的军队由N个部门组成,为了提高安全性,部门之间建立了M条通路,每条通路只能单向传递信息,即一条从部门a到部门b的通路只能由a向b传递信息。

信息可以通过中转的方式进行传递,即如果a能将信息传递到b,b又能将信息传递到c,则a能将信息传递到c。

一条信息可能通过多次中转最终到达目的地。

由于保密工作做得很好,并不是所有部门之间都互相知道彼此的存在。

只有当两个部门之间可以直接或间接传递信息时,他们才彼此知道对方的存在。

部门之间不会把自己知道哪些部门告诉其他部门。

上图中给了一个4个部门的例子,图中的单向边表示通路。

部门1可以将消息发送给所有部门,部门4可以接收所有部门的消息,所以部门1和部门4知道所有其他部门的存在。

部门2和部门3之间没有任何方式可以发送消息,所以部门2和部门3互相不知道彼此的存在。

现在请问,有多少个部门知道所有N个部门的存在。

或者说,有多少个部门所知道的部门数量(包括自己)正好是N。

【输入形式】输入的第一行包含两个整数N, M,分别表示部门的数量和单向通路的数量。

所有部门从1到N标号。

接下来M行,每行两个整数a, b,表示部门a到部门b有一条单向通路。

【输出形式】输出一行,包含一个整数,表示答案。

【问题分析】①处理对象:N个整数和M对表示边的整数。

②实现的功能:基于图的ADT计算知道所有N个部门的存在的部门数量。

③结果的显示:输出知道所有N个部门的存在的部门数量。

【抽象数据类型设计】&&【物理数据对象设计】结构特征:图图的ADT:【算法思想设计】(说明:此解法只适用于测试数据规模较小的情况)通过验证图中每个顶点到其他点的连通性来判断知道所有N个部门的存在的部门数量:首先定义图的ADT和继承类Graphm的设计,根据输入所给顶点和各边,基于图的邻接矩阵建立图各顶点的对应关系从而构建图。

然后在Graphm类中增加声明一个数组num,用于后继作为表示某顶点到图中其他各点是否连通的标记,然后对于每个顶点,根据邻接矩阵通过DFS1深度优先检索依照边的方向正向(可以向其他点发出讯息)搜索与该点连通的其他各点并在num数组中做好标记,通过DFS2深度优先检索依照边的方向反向(可以接收到其他点发出讯息)搜索与该点连通的其他各点并在num数组中做好标记,最后遍历num数组中的元素,若发现有该点与其他某点不连通的标记,在表示该部门不知道所有N个部门的存在,否则表示该部门知道所有N个部门的存在。

(完整word版)图的应用 实验

(完整word版)图的应用  实验

图的应用实验日志实验题目:图的建立及输出实验目的:建立图的存储结构(图的类型可以是有向图、无向图、有向网、无向网,学生可以任选两种类型),能够输入图的顶点和边的信息,并存储到相应存储结构中,而后输出图的邻接矩阵。

实验主要步骤:1.编辑源程序;2.编写有向图的实现程序;3.编写实现无向图的源程序;4.连接—编译—运行该程序,并在过程中调试。

源程序:#include<stdio.h>#include<string.h>#define MAX_VERTEX_NUM 20typedef struct{int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];int vexnum;int arcnum;char vexs[MAX_VERTEX_NUM];}MGraph;int LocateVex(MGraph G,char v){int i;for(i=0;i<G.vexnum;++i){if(G.vexs[i]==v)return i;}return 0;}int CreateUDG(MGraph G){int i,j,k,w;char v1,v2;printf("请输入顶点和边:\n");scanf("%d%d",&G.vexnum,&G.arcnum); for(i=0;i<G.vexnum;i++)for(j=0;j<G.vexnum;j++)G.arcs[i][j]=0;for(;;){w=getchar();break;}printf("请输入代替顶点的字母:\n"); for(i=0;i<G.vexnum;++i) {scanf("%c",&G.vexs[i]);}for(;;){w=getchar();break;}printf("请输入每条边相连的两个顶点:\n"); for(k=0;k<G.arcnum;k++) {v1=getchar();v2=getchar();i=LocateVex(G,v1);j=LocateVex(G,v2);G.arcs[i][j]=1;}for(i=0;i<G.vexnum;i++)for(j=0;j<G.vexnum;j++)G.arcs[j][i]=G.arcs[i][j];printf("输出的领接矩阵是:\n");for(i=0;i<G.vexnum;i++) {for(j=0;j<G.vexnum;j++)printf(" %d ",G.arcs[i][j]);printf("\n");}return 0;}int CreateDG(MGraph G){int i,j,k,w;char v1,v2;printf("请输入顶点和边:\n");scanf("%d%d",&G.vexnum,&G.arcnum);for(i=0;i<G.vexnum;i++)for(j=0;j<G.vexnum;j++)G.arcs[i][j]=0;for(;;){w=getchar();break;}printf("请输入代替顶点的字母:\n");for(i=0;i<G.vexnum;++i) {scanf("%c",&G.vexs[i]);}for(;;){w=getchar();break;}printf("请输入每条边相连的两个顶点:\n"); for(k=0;k<G.arcnum;k++) {v1=getchar();v2=getchar();i=LocateVex(G,v1);j=LocateVex(G,v2);G.arcs[i][j]=1;printf("输出的领接矩阵是:\n");for(i=0;i<G.vexnum;i++) {for(j=0;j<G.vexnum;j++)printf(" %d ",G.arcs[i][j]);printf("\n");}return 0;}void main(){char kind[5];MGraph G;printf("请输入要建立的图的类型(UDG或DG):\n");scanf("%s",kind);if(strcmp("UDG",kind)==0)CreateUDG(G);if(strcmp("DG",kind)==0)CreateDG(G);实验结果:心得体会:通过实验掌握有向图和无向图的概念;掌握邻接矩阵和邻接链表建立图的存储结构;。

数据结构实验报告--图

数据结构实验报告--图

数据结构实验报告--图
数据结构实验报告--图
1、实验目的
本实验主要旨在通过实践操作,深入理解图这种数据结构的基本概念、性质和基本操作,掌握图的存储结构与常见算法。

2、实验环境
本次实验使用编程语言C++,在Windows平台下进行开发和运行。

3、实验内容
3.1 图的定义与基本概念
在本章中,我们将介绍图的基本概念,包括有向图与无向图、顶点与边、度与入度出度、连通性等。

3.2 图的存储结构
在本章中,我们将介绍图的几种存储结构,包括邻接矩阵、邻接表和十字链表,以及它们的优缺点和适用场景。

3.3 图的遍历
在本章中,我们将介绍图的两种常用的遍历算法,即深度优先搜索(DFS)和广度优先搜索(BFS),并分别给出它们的实现代码和应用场景。

3.4 最短路径
在本章中,我们将介绍图的最短路径问题,包括单源最短路径和全源最短路径。

我们将使用Dijkstra算法和Floyd-Warshall算法来解决这些问题,并给出它们的实现代码和应用场景。

3.5 最小树
在本章中,我们将介绍图的最小树问题,即找到一棵树使得树上的边的权值之和最小。

我们将使用Prim算法和Kruskal算法来解决这个问题,并给出它们的实现代码和应用场景。

4、实验步骤和结果
在本章中,我们将详细介绍实验的具体步骤,并给出实验结果的详细分析和说明。

5、实验总结
在本章中,我们将对整个实验进行总结,总结实验中遇到的问题、解决方案和经验教训。

6、附件
本实验报告所涉及的附件包括实验代码和运行结果的截图。

7、法律名词及注释
本文所涉及的法律名词和注释详见附件中的相关文件。

图的应用实验报告

图的应用实验报告

图的应用实验报告图的应用实验报告引言:图是一种重要的数据结构,在计算机科学和数学领域有着广泛的应用。

本实验旨在通过实际应用场景,探究图的应用及其解决问题的能力。

本文将从图的定义、图的遍历算法以及图的最短路径算法等方面展开讨论。

一、图的定义和基本概念图是由节点和边组成的一种数据结构,用于描述事物之间的关系。

节点表示事物,边表示事物之间的联系。

图可以分为有向图和无向图两种类型。

有向图中的边有方向性,无向图中的边没有方向性。

二、图的应用场景1. 社交网络分析社交网络中的用户可以看作是图的节点,用户之间的关系可以看作是图的边。

通过分析社交网络图,可以发现用户之间的关联性,从而进行精准推荐、社群发现等操作。

2. 交通网络规划交通网络中的道路可以看作是图的边,交通路口可以看作是图的节点。

通过图的最短路径算法,可以计算出最优的交通路线,实现交通网络的高效规划。

3. 电子电路设计电子电路中的元件可以看作是图的节点,元件之间的连接可以看作是图的边。

通过图的遍历算法,可以检测电路中的故障,优化电路的设计。

三、图的遍历算法图的遍历算法用于访问图中的所有节点。

常见的图的遍历算法有深度优先搜索(DFS)和广度优先搜索(BFS)。

1. 深度优先搜索(DFS)深度优先搜索从图的某个节点开始,先访问该节点,然后递归地访问该节点的邻接节点,直到所有节点都被访问过。

DFS可以用于解决迷宫问题、拓扑排序等。

2. 广度优先搜索(BFS)广度优先搜索从图的某个节点开始,先访问该节点,然后依次访问该节点的所有邻接节点,再访问邻接节点的邻接节点,以此类推。

BFS可以用于解决最短路径问题、连通性检测等。

四、图的最短路径算法最短路径算法用于计算图中两个节点之间的最短路径。

常见的最短路径算法有迪杰斯特拉算法和弗洛伊德算法。

1. 迪杰斯特拉算法迪杰斯特拉算法通过逐步扩展最短路径的方式,计算出图中某个节点到其它所有节点的最短路径。

该算法适用于边权重非负的图。

数据结构实验报告图的应用

数据结构实验报告图的应用

实验题目:图的应用一、实验目的和任务1 掌握图的邻接表和邻接矩阵存储;2 掌握图的拓扑排序算法;二、实验内容及原理1以下两项内容选做一项。

2 请按照书中介绍的拓扑排序算法,完成P303页第5题。

3 给定某一个图,完成其深度优先搜索遍历和广度优先搜索遍历,每种遍历都必须在邻接矩阵和邻接表中完成。

四、实验数据及程序代码#include <iostream.h>#include <stdlib.h>#include <strstrea.h>#include <string.h>#include <stdio.h>const int MaxVertexNum=10;typedef int WeightType;struct edgenode{int adjvex;WeightType weight;edgenode*next;};typedef edgenode *adjlist[MaxVertexNum];void InitAdjoin(adjlist GL)//初始化{for(int i=0;i<MaxVertexNum;i++)GL[i]=NULL;}void CreatAdjoin(adjlist GL,int n,char*s,int k1,int k2)//生成邻接表{istrstream sin(s);char c1,c2,c3;WeightType w;edgenode*p;sin>>c1;if(k2==0){do{sin>>c1>>i>>c2>>j>>c3;p=new edgenode;p->adjvex=j;p->weight=1;p->next=GL[i];GL[i]=p;if(k1==0){p=new edgenode;p->adjvex=i;p->weight=1;p->next=GL[j];GL[j]=p;}sin>>c1;}while(c1==',');}else{do{sin>>c1>>i>>c2>>j>>c3>>w;p=new edgenode;p->adjvex=j;p->weight=w;p->next=GL[i];GL[i]=p;if(k1==0){p=new edgenode;p->adjvex=i;p->weight=w;p->next=GL[j];GL[j]=p;}sin>>c1;}while(c1==',');}}void PrintAdjion(adjlist GL, int n,int k1, int k2) {edgenode*p;cout<<"V={";for(i=0; i<n-1; i++) cout<<i<<',';cout<<n-1<<'}'<<endl;cout<<"E={";for(i=0;i<n;i++){if(k2==0){p=GL[i];while(p){j=p->adjvex;if(k1==0){if(i<j) cout<<'('<<i<<','<<j<<')'<<',';}elsecout<<'<'<<i<<","<<j<<'>'<<',';p=p->next;}}else{p=GL[i];while(p){j=p->adjvex;if(k1==0){if(i<j) cout<<'('<<i<<','<<j<<')'<<p->weight<<',';}elsecout<<'<'<<i<<','<<j<<'>'<<p->weight<<',';p=p->next;}}}cout<<'}'<<endl;}void Toposort(adjlist GL , int n){int i,j,k,top,m=0;edgenode*p;int*d=new int[n];for(i=0;i<n;i++) d[i]=0;for(i=0;i<n;i++){p=GL[i];while(p!=NULL){j=p->adjvex;d[i]++;p=p->next;//cout<<j;}}top=-1;for(i=0;i<n;i++)if(d[i]==0){d[i]=top; top=i;}while(top!=-1){j=top;top=d[top];cout<<j<<' ';m++;p=GL[j];while(p!=NULL){k=p->adjvex;d[k]--;if(d[k]==0){d[k]=top;top=k;}p=p->next;}}cout<<endl;cout<<top<<endl;cout<<m<<endl;cout<<n<<endl;if(m<n) cout<<"The network has a cycle!"<<endl;delete []d;}void main(){int n,k1,k2;cout<<"输入待处理图的顶点数:";cin>>n;cout<<"输入图的有无向和有无权选择(0为无,非0为有):";cin>>k1>>k2;adjlist gl;InitAdjoin(gl);cout<<"输入图的边集:";FILE *p;p=fopen("d:\\1.txt","r+");char *a=new char[100];while (!feof(p)){fscanf(p,"%s ",a);cout<<a;}cout<<endl;//cin>>a;CreatAdjoin(gl,n,a,k1,k2);Toposort(gl,n);}五、实验数据分析及处理六、实验结论与感悟(或讨论)图的邻接矩阵,邻接表和边集数组表示各有利弊,具体运用时,要根据图的稠密和稀疏程度以及算法的要求进行选择。

数据结构中图的应用

数据结构中图的应用
return -1;
}
private:
int vNum, eNum;
dist NoEdge, **edge; name *vertex;
bool find(const name& v)
{
for (int i = 0; i < vNum; i++) if (v == vertex[i]) return true;
const int maxV = 20;//最大节点数
template <class name, class dist>
class AdjMatrix
{
friend class Network<name, dist, AdjMatrix<name, dist> >;
public:
AdjMatrix() : vNum(0), eNum(0)
DFS和BFS的实现
public:
void DFS(void(*visit)(name v) = print)
{
visited = new bool[vNum()];
for (int i = 0; i < vNum(); i++) visited[i] = false;
DFS(0, visit);
delete []visited;
delete []edge; delete []vertex;
}
bool insertV(name v)
{
if (find(v)) return false;
vertex[vNum] = v;
for (int i = 0; i < maxV; i++) edge[vNum][i] = NoEdge;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构实验报告
20 10 ~20 11 学年第一学期2008级计算机专业
班级:学号:姓名:
实验四图的应用
一、实验目的:
1.掌握图的存储结构及其构造方法
2.掌握图的两种遍历算法及其执行过程
二、实验内容:
以邻接矩阵或邻接表为存储结构,以用户指定的顶点为起始点,实现无向连通图的深度优先及广度优先搜索遍历,并输出遍历的结点序列。

提示:首先,根据用户输入的顶点总数和边数,构造无向图,然后以用户输入的顶点为起始点,进行深度优先和广度优先遍历,并输出遍历的结果。

三、实验要求:
1.各班学号为单号的同学采用邻接矩阵实现,学号为双号的同学采用邻接表实现。

2.C/ C++完成算法设计和程序设计并上机调试通过。

3.撰写实验报告,提供实验结果和数据。

4.写出算法设计小结和心得。

四、程序源代码:
#include<iostream.h>
typedef char vextype;
const MAXVER=21;
typedef struct listnode {
int adjvex;
listnode* next;
}listnode;//表结点
typedef struct
{
vextype data;
listnode *first;
}headnode;//头结点typedef struct
{
headnode vexs[MAXVER];
int vexnum,arcnum;
} ALgraph;//图
void createALgraph(ALgraph &G)
{
int i, s, d;
listnode *p,*q;
cout<<"输入图的顶点数和边数:"; cin>>G.vexnum>>G.arcnum;
for(i=1;i<=G.vexnum;i++)
{
cout<<"\n输入第"<<i<<"个顶点信息:"; cin>>G.vexs[i].data;
G.vexs[i].first=NULL;
} //输入第i个结点值并初始化第i个单链表为空
for(i=1; i<=G.arcnum; i++)
{
cout<<"\n输入第"<<i<<"条边的始点和终点:";
cin>>s>>d;//s为始点,d为终点
p=new listnode;
p->adjvex=d;
p->next=G.vexs[s].first;
G.vexs[s].first=p;
//将新建的以d为信息的表结点p插入s 单链表的头结点后
q=new listnode;
q->adjvex=s;
q->next=G.vexs[d].first;
G.vexs[d].first=q;
//将新建的以s为信息的表结点q插入d 单链表的头结点后
}
}
int visited[MAXVER];//定义全局数组遍历visited
void dfs(ALgraph G, int v)//被遍历的图
G采用邻接表作为存储结构,v为出发顶点编号
{
listnode *p;
cout<<G.vexs[v].data;
visited[v]=1;
p=G.vexs[v].first;
while(p!=NULL)
{
if(visited[p->adjvex]==0)
dfs(G,p->adjvex);
//若p所指表结点对应的邻接顶点未访问则递归地从该顶点出发调用dfs
p=p->next;
}
}
void dfsTraverse(ALgraph G)
{
int v;
//遍历图之前初始化各未访问的顶点
for(v=1; v<=G.vexnum; v++)
visited[v]=0;
//从各个未被访问过的顶点开始进行深度遍历
for(v=1;v<=G.vexnum;v++)
if(visited[v]==0) dfs(G,v);
}
void BFS(ALgraph G, int v)
//从顶点编号v出发,广度遍历邻接表存储的图G
{
int queue[MAXVER], front ,rear;
listnode* p;
front=rear=0;
cout<<G.vexs[v].data;
visited[v]=1;
queue[++rear]=v;
while(front!=rear)
{
v=queue[++front];
p=G.vexs[v].first;
while(p!=NULL)
{
if(visited[p->adjvex]==0)
{
v=p->adjvex;
cout<<G.vexs[v].data;
visited[v]=1;
queue[++rear]=v;
}
p=p->next;
}
} }
void BFSTraverse(ALgraph G)
{
int v;
//遍历G以前,初始化visited数组为0 for(v=1;v<=G.vexnum;v++)
visited[v]=0;
for(v=1;v<=G.vexnum;v++)
if(visited[v]==0)
BFS(G,v);
}
void main()
{
ALgraph g;
createALgraph(g);
cout<<endl<<"深度遍历结果为:";
dfsTraverse(g);
cout<<endl<<"广度遍历结果为:";
BFSTraverse(g);
cout<<endl;
}
五、程序运行情况(写出输入数据及运行结果)
六、小结(包括收获、心得体会、存在的问题及解决问题的方法、建议等)
本次实验是对邻接表和邻接矩阵的应用,使用邻接表为存储结构实现无向连通图的深度优先和广度优先搜索遍历,通过本次实验,我对图的存储结构及其构造方法有了进一步了解,对深度遍历和广度遍历的实现有了更深的认识。

相关文档
最新文档