2018-2019数据结构实验书指导书(图实验第一部分)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

float weight;
friend bool operator<(GraphNode a, GraphNode b) //自定义优先级,weight 小的优先
template <class T> class Graph { public: //********************邻接矩阵函数************************************// Graph(int* vertexArray, T* nameOfVertex, int numberOfVertex);//构造函数,初始化具有 n 个顶点的图 //~Graph();//析构函数 void Prim(int source);//Prim 算法 void GetVexInfo();//取顶点信息 void GetArcInfo();//输出变信息 void SetArc(int vertextFrom, int vertextTo, int arcLength);//修改边 void DeleteVex(int vertex);//删除顶点 vertex void InsertVex(int position, T name);//在 position 的位置上插入一顶点,值为 name void DeleteArc(int vertextFrom, int vertextTo);//在图中删除一条边,其依附的两个顶点的 编号为 vertextFrom 和 vertextTo void InsertArc(int vertextFrom, int vertextTo, int value);//在图中插入一条边,其依附的两 个顶点的编号为 vertextFrom 和 vertextTo void PrintAdjacencyMatrix();//输出邻接矩阵 private: int vertexNum, arcNum;//图的顶点数和边数 //vector<T> vertexName;//存放图中顶点的数组 vector< vector<int> > adjacencyMatrix;//邻接矩阵 }; template <class T> Graph<T>::Graph(int* vertexArray, T* nameOfVertex, int numberOfVertex)//构造图 { vertexNum = numberOfVertex;//顶点数 arcNum = 0;//边数 GraphNode tempGraphNode; for (int i = 0; i < vertexNum; i++) { tempGraphNode.vertexName = nameOfVertex[i]; tempGraphNode.index = i; graphNodeArray.push_back(tempGraphNode); adjacencyMatrix vector< GraphNode > graphNodeArray;//存放图中顶点的数组
数据结构与算法 实验指导书
中国石油大学(北京)计算机科学与技术系


《数据结构》 是计算机及相关专业的一门核心基础课程, 也是很多高校考研专业课之一。 它主要介绍线性结构、树结构、图结构三种逻辑结构元素的存储实现,在此基础上介绍一些 典型算法及时、空效率分析。这门课程的主要任务是培养学生的算法设计能力及良好的程序 设计习惯。通过学习,要求学生能够掌握典型算法的设计思想及程序实现,能够根据实际问 题选取合适的存储方案,设计出简洁、高效、实用的算法,为后续课程的学习及软件开发打 下良好的基础。学习这门课程,习题和实验是两个关键环节。学生理解算法,上机实验是最 佳的途径之一。因此,实验环节的好坏是学生能否学好《数据结构》的关键。为了更好地配 合学生实验,特编写实验指导书。 一、实验目的 更好的理解算法的思想、培养编程能力。 二、实验要求 1、每次实验前学生必须根据试验内容认真准备实验程序及调试时所需的输入数据。 2、在指导教师的帮助下能够完成实验内容,得出正确的实验结果。 3、实验结束后总结实验内容、书写实验报告。 4、遵守实验室规章制度、不缺席、按时上、下机。 5、实验学时内必须做数据结构的有关内容,不允许上网聊天或玩游戏,如发现上述现 象,取消本次上机资格,平时成绩扣 10 分。 6、实验报告有一次不合格,扣 5 分,两次以上不合格者,平时成绩以零分记。 三、实验环境 VC++6.0 或者 VC2010 四、说明 1、本实验的所有算法中元素类型可以根据实际需要选择。 2、 实验题目中带*者为较高要求, 学生可自选; 其余部分为基本内容, 应尽量完成 (至 少完成 70%,否则实验不合格) 。 3、 数据结构是很多高校的硕士研究生入学考试的专业课之一, 希望有志于考研的学生 能够在学习过程中注意各种算法的理解,以便为考研做一定的准备。 五、实验报告的书写要求 1.明确实验的目的及要求; 2.记录实验的输入数据和输出结果; 3.说明实验中出现的问题和解决过程; 4.写出实验的体会和实验过程中没能解决的问题; 六、参考书目 《数据结构》 (C++语言描述) 王红梅等 清华大学出版社(影印版) 清华大学出版社 《DATA STRUCTURE WITH C++》 William Ford,William Topp
Fra Baidu bibliotek
<< "的路径长度为:" << adjacencyMatrix[i][j] << "\n"; } } } /* 前置条件:图已存在 输入:顶点 name,位置 i 功能:在图中 i 位置插入一个顶点 name 输出:如果插入不成功,抛出异常 后置条件:如果插入成功,图中增加了一个顶点 */ template <class T> void Graph<T>::InsertVex(int position, T name)//在图中插入一个顶点, 其插入位置为 position, 顶点名称为 name { //假设源点是第 0 个顶点,即顶点序号是 0 if (position<0 || position>graphNodeArray.size()) throw "位置不正确";//如果 num 输入不正 确抛出异常 vector<int>tempRow(graphNodeArray.size(), INT_MAX); GraphNode tempGraphNode; tempGraphNode.vertexName = name; graphNodeArray.insert(graphNodeArray.begin() + position, tempGraphNode); adjacencyMatrix.insert(adjacencyMatrix.begin()+ position, tempRow); for (unsigned i = 0; i < graphNodeArray.size(); ++i) { adjacencyMatrix[i].insert(adjacencyMatrix[i].begin() + position, INT_MAX); } this->vertexNum= this->vertexNum +1; }
实验五 图的有关操作
实验类型:验证性 实验要求:必修 实验学时: 2 学时 一、实验目的: 参照给定的图类的程序样例,验证给出的有关图的常见算法,并实现有关的操作。 二、实验要求: 1、掌握图的特点,利用图的邻接矩阵和邻接表的存储结构实现图的常见算法。 2、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、 程序清单、调试情况、设计技巧、心得体会。 三、实验内容: 1. 设计邻接矩阵图类,实现如下操作: (1)测试类中的成员函数; (2)实现最小生成树算法 Prim 和 Kruskal 算法; (3)设计主函数,输入数据,测试各算法。 2. 设计邻接表类,实现无向图的深度优先非递归遍历、无向图的广度优先遍历,并 设计主函数输入数据进行测试。 *3.假设图 G 采用邻接表存储,设计一个算法,输出图 G 中从顶点 u 到顶点 v 的长度为 l 的所有简单路径。 四、程序样例: (1)Prim 算法 #include<iostream> #include<string> #include <vector> #include <queue> using namespace std; //template <class T> struct GraphNode//图结点 { string bool int { return a.weight > b.weight; } }; vertexName; //顶点名称 visited; index; //访问标记 //顶点权值 //顶点标号
{ cout << graphNodeArray[i].vertexName << "\n"; } } /* 前置条件:图已存在 输入:顶点 v1,v2 功能:修改顶点 v1、v2 的路径 输出:修改后图中所有的路径 后置条件:图保持不变 */ template <class T> void Graph<T>::SetArc(int vertextFrom, int vertextTo, int arclength)//修改路径 { //假设源点是第 0 个顶点,即顶点序号是 0 if (vertextFrom>vertexNum || vertextTo>vertexNum) throw "位置";//错误抛出异常 else { adjacencyMatrix[vertextFrom][vertextTo] = arclength; //修改 v1 顶点到 v2 顶点的距离 adjacencyMatrix[vertextTo][vertextFrom] = arclength; } } /* 前置条件:图已存在 输入:无 功能:输出图中所有的路径 输出:图中所有顶点的数据信息 后置条件:图保持不变 */ template <class T> void Graph<T>::GetArcInfo()//获取图中边的信息 { for (int i = 0; i<graphNodeArray.size(); i++) {//输出任意两点之间的路径 for (int j = 0; j<i; j++) { if (adjacencyMatrix[i][j]<INT_MAX)//两点之间存在路径 //若两点间有路,则输出该两点间的路径 cout << " 从 " << graphNodeArray[i].vertexName << " 到 " << graphNodeArray[j].vertexName
} adjacencyMatrix.resize(vertexNum, vector<int>(vertexNum)); for (int i = 0; i<vertexNum; i++)//给边赋置 for (int j = 0; j<vertexNum; j++) { adjacencyMatrix[i][j] = *(vertexArray + i*vertexNum + j); if (adjacencyMatrix[i][j] < INT_MAX) arcNum++; } this->arcNum = arcNum / 2;//无向图 } template <class T> void Graph<T>::PrintAdjacencyMatrix() { cout << "图 G 的顶点数是:" << vertexNum << endl;//输出顶点数 cout << "顶点向量的值是:" << endl; for (int i = 0; i < graphNodeArray.size(); i++) cout << graphNodeArray[i].vertexName << endl;//输出顶点表各顶点数据 cout << "图 G 的边数是:"<< arcNum << endl; for (int i = 0; i < adjacencyMatrix.size(); i++) for (int j = i + 1; j < adjacencyMatrix.size(); j++) { if (adjacencyMatrix[i][j] < INT_MAX) //有效,输出边 cout << "(" << i << ", "<< j << ", " << adjacencyMatrix[i][j] << ")" << endl; } } /* 前置条件:图已存在 输入:无 功能:输出图中所有顶点的数据信息 输出:图中所有顶点的数据信息 后置条件:图保持不变 */ template <class T> void Graph<T>::GetVexInfo()//取顶点 { for (int i = 0; i<graphNodeArray.size(); i++)//输出图中所有的顶点 //输出边数
相关文档
最新文档