1、山东大学数据结构实验报告八山东大学 软件工程 学院 数据结构 课程实验报告学号:姓名: 班级: 软件工程2014级2班实验题目: 图的操作实验学时:实验日期: 2015.12.9实验目的:掌握图的基本概念,描述方法;遍历方法。硬件环境:实验室软件环境:Vistual Studio 2013 实验步骤与内容:实验内容:1、创建图类。二叉树的存储结构使用邻接矩阵或链表。2、提供操作:遍历、BFS、DFS3、对建立好的图,执行上述各操作。4、输出生成树。5、输出最小生成树。代码体:Adjacencywdigraph.h#ifndef ADJACENCYWDIGRAPH_H#define ADJACE
2、NCYWDIGRAPH_Hclass AdjacencyWDigraph friend class AdjacencyWGraph;public: AdjacencyWDigraph(int Vertices = 10, int noEnge = 0); AdjacencyWDigraph(); bool Exist(int i, int j) const; int Edges() const return e; int Vertices() const return n; AdjacencyWDigraph& Add(int i, int j, const int& w = 1); Adja
3、cencyWDigraph& Delete(int i, int j); int OutDegree(int i) const; int InDegree(int i) const; void InitializePos() pos = new intn + 1; void DeactivatePos() delete pos; int Begin(int i); int NextVertex(int i); void BFS(int v, int reach, int label = 1); void DFS(int v, int reach, int label = 1); bool Co
4、nnected(int& x); int* SpanningTree(); int* SpanningMinTree(); void OutPut();private: int MinNum(); int Min(int v, int reach); bool Connecting(int i); void dfs(int v, int reach, int label); int NoEdge, n, e; int *a; int *pos;#endifAdjacencywdigraph.cpp#include#includeusing namespace std;#include adja
5、cencywdigraph.hAdjacencyWDigraph:AdjacencyWDigraph(int Vertices, int noEdge) n = Vertices; e = 0; NoEdge = noEdge; a = new int*n + 1; for (int i = 1; i = n; i+) ai = new intn + 1; for (int i = 1; i = n; i+) for (int j = 1; j = n; j+) aij = NoEdge;AdjacencyWDigraph:AdjacencyWDigraph() for (int i = 1;
6、 i = n; i+) delete ai; delete a;bool AdjacencyWDigraph:Exist(int i, int j) const if (i 1 | j n | j n | aij = NoEdge) return false; return true;AdjacencyWDigraph& AdjacencyWDigraph:Add(int i, int j, const int& w) if (i 1 | j n | j n) cout 错误!点 i 或点 j 不存在,无法添加边 endl; else if (aij != NoEdge) cout 错误!该边
7、已存在,无法再添加 endl; else aij = w; e+; return *this;AdjacencyWDigraph& AdjacencyWDigraph:Delete(int i, int j) if (i 1 | j n | j n | aij = NoEdge) cout 错误!该边不存在,无法删除 endl; else aij = NoEdge; e-; return *this;int AdjacencyWDigraph:OutDegree(int i) const if (i n) cout 错误,该点不存在! endl; return 0; else int sum
8、= 0; for (int j = 1; j = n; j+) if (aij != NoEdge) sum+; return sum; int AdjacencyWDigraph:InDegree(int i) const if (i n) cout 错误,该点不存在! endl; return 0; else int sum = 0; for (int j = 1; j = n; j+) if (aji != NoEdge) sum+; return sum; int AdjacencyWDigraph:Begin(int i) if (i n) cout 错误,该点不存在! endl;
9、return 0; else for (int j = 1; j = n; j+) if (aij != NoEdge) posi = j; return j; posi = n + 1; return 0; int AdjacencyWDigraph:NextVertex(int i) if (i n) cout 错误,该点不存在! endl; return 0; else for (int j = posi + 1; j = n; j+) if (aij != NoEdge) posi = j; return j; posi = n + 1; return 0; void Adjacenc
10、yWDigraph:BFS(int v, int reach, int label) if (v n) cout 错误,该点不存在! endl; return; queue q; InitializePos(); reachv = label; q.push(v); while (!q.empty() int w = q.front(); q.pop(); int u = Begin(w); while (u) if (!reachu) q.push(u); reachu = label; u = NextVertex(w); DeactivatePos();void AdjacencyWDi
11、graph:dfs(int v, int reach, int label) reachv = label; int u = Begin(v); while (u) if (!reachu) dfs(u, reach, label); u = NextVertex(v); void AdjacencyWDigraph:DFS(int v, int reach, int label) if (v n) cout 错误,该点不存在! endl; return; InitializePos(); dfs(v, reach, label); DeactivatePos();void Adjacency
12、WDigraph:OutPut() for (int i = 1; i = n; i+) for (int j = 1; j = n; j+) cout aij t; cout endl; bool AdjacencyWDigraph:Connecting(int i) int *reach = new intn + 1; for (int j = 1; j = n; j+) reachj = 0; BFS(i, reach, 1); for (int j = 1; j = n; j+) if (!reachj) deletereach; return false; delete reach;
13、 return true;bool AdjacencyWDigraph:Connected(int& x) bool *flag = new booln + 1; for (int i = 1; i = n; i+) flagi = Connecting(i); for (int i = 1; i = n; i+) if (flagi) x = i; return true; return false;int AdjacencyWDigraph:Min(int v, int reach) int k = 0, min = 0; for (int i = 1; i avi) k = i; min
14、 = avi; return k;int* AdjacencyWDigraph:SpanningTree() int x; if (!Connected(x) cout 该图不是连通图,无法生成树! endl; return 0; else InitializePos(); queue q; int *b = new int*n + 1; for (int i = 1; i = n; i+) bi = new intn + 1; for (int i = 1; i = n; i+) for (int j = 1; j = n; j+) bij = 0; int *reach = new int
15、n + 1; for (int i = 1; i = n; i+) reachi = 0; reachx = 1; q.push(x); while (!q.empty() int w = q.front(); q.pop(); int u = Begin(w); while (u) if (!reachu) q.push(u); bwu = awu; reachu = 1; u = NextVertex(w); delete reach; DeactivatePos(); return b; int AdjacencyWDigraph:MinNum() int k = 0, m = 0; f
16、or (int i = 1; i = n; i+) if (Connecting(i) int min = 0; for (int j = 1; j aij) min = aij; if (m & m min) m = min; k = i; else if (!m) m = min; k = i; return k;int* AdjacencyWDigraph:SpanningMinTree() int x; if (!Connected(x) cout 该图不是连通图,无法生成树! endl; return 0; else int *b = new int*n + 1; for (int
17、i = 1; i = n; i+) bi = new intn + 1; for (int i = 1; i = n; i+) for (int j = 1; j = n; j+) bij = 0; int *reach = new intn + 1; for (int i = 1; i = n; i+) reachi = 0; x = MinNum(); reachx = 1; int k1, k2, z, min = 1; while (min) min = 0; for (int i = 1; i aik2) min = aik2; z = i; k1 = k2; reachk1 = 1
18、; bzk1 = azk1; delete reach; return b; Adjacencywgraph.h#ifndef ADJACENCYWGRAPH_H#define ADJACENCYWGRAPH_H#include adjacencywdigraph.hclass AdjacencyWGraph :public AdjacencyWDigraphpublic: AdjacencyWGraph(int Vertices = 10, int noEdge = 0): AdjacencyWDigraph(Vertices, noEdge) AdjacencyWGraph& Add(in
19、t i, int j, const int& w = 1); AdjacencyWGraph& Delete(int i, int j); int Degree(int i) return OutDegree(i); bool Connected(); int* SpanningTree(); int* SpanningMinTree(); int MinNum();#endifAdjacencywgraph.cpp#include#includeusing namespace std;#include adjacencywgraph.hAdjacencyWGraph& AdjacencyWG
20、raph:Add(int i, int j, const int& w) if (i 1 | j n | j n) cout 错误!点 i 或点 j 不存在,无法添加边 endl; else if (aij != NoEdge) cout 错误!该边已存在,无法再添加 endl; else aij = w; aji = w; e+; return *this;AdjacencyWGraph& AdjacencyWGraph:Delete(int i, int j) if (i 1 | j n | j n | aij = NoEdge) cout 错误!该边不存在,无法删除 endl; else
21、 aij = NoEdge; aji = NoEdge; e-; return *this;bool AdjacencyWGraph:Connected() int *reach = new intn + 1; for (int i = 1; i = n; i+) reachi = 0; BFS(1, reach, 1); for (int i = 1; i = n; i+) if (!reachi) return false; return true;int* AdjacencyWGraph:SpanningTree() if (!Connected() cout 该图不是连通图,无法生成树
22、! endl; return 0; else InitializePos(); queue q; int *b = new int*n + 1; for (int i = 1; i = n; i+) bi = new intn + 1; for (int i = 1; i = n; i+) for (int j = 1; j = n; j+) bij = 0; int *reach = new intn + 1; for (int i = 1; i = n; i+) reachi = 0; reach1 = 1; q.push(1); while (!q.empty() int w = q.f
23、ront(); q.pop(); int u = Begin(w); while (u) if (!reachu) q.push(u); bwu = buw = awu; reachu = 1; u = NextVertex(w); DeactivatePos(); delete reach; return b; int AdjacencyWGraph:MinNum() int d = 0, e = 0, min = 0; for (int i = 1; i = n; i+) for (int j = 1; j = n; j+) if (aij != NoEdge & !min) min =
24、aij; d = i; e = j; else if (aij != NoEdge & aij min) min = aij; d = i; e = j; return d;int* AdjacencyWGraph:SpanningMinTree() if (!Connected() cout 该图不是连通图,无法生成树! endl; return 0; else int *b = new int*n + 1; for (int i = 1; i = n; i+) bi = new intn + 1; for (int i = 1; i = n; i+) for (int j = 1; j = n; j+) bij = 0; int *reach = new intn + 1; for (int i =
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1