GraphLink.h文件
/*
*Copyright 中国地质大学(武汉) 信息工程学院
*All right reserved.
*
*文件名称:GraphLink.h
*摘 要:实现图的邻接表表示-有向图
*
*当前版本:1.0
*作 者:邵玉胜
*完成日期:2018-04-11
*/
#pragma once
#include<iostream>
#include<assert.h>
using namespace std;
template<class T, class E> //T表示顶点的数据类型, E表示边的数据类型
struct Edge { //边结点的定义
int _dest; //边的另一顶点位置
E _cost; //边上的权值
Edge<T, E>* _pLink; //下一条边链指针
Edge() :_pLink(nullptr) {}; //构造函数
Edge(int num, E weight) :_dest(num), _cost(weight), _pLink(nullptr) {};//带参数的构造函数
bool operator !=(Edge<T, E>& R) { //判边不等否
return this->_dest == R._dest;
}
};
template<class T, class E> //T表示顶点的数据类型, E表示边的数据类型
struct Vertex{ //顶点的结构体定义
T _data; //顶点的名字
Edge<T, E>* _pAdj; //边链表的头指针
};
const int defaultVertexes = 60; //图中默认的顶点数为60
template<class T, class E> //T表示顶点的数据类型, E表示边的数据类型
class GraphLink {
friend istream& operator >> (istream& in,
GraphLink<T, E>& R) { //模板类的友元函数只能定义在类中
int numT, numE; //保存临时输入的顶点数与边数
T tempV1, tempV2; //保存顶点值的临时变量
int tempIdx1, tempIdx2; //用于保存顶点链表下标的临时变量
E tempE; //保存边值的临时变量
cout << "请输入图中的顶点数:";
in >> numT;
if (in.fail()) { //判断是否输入的是一个整数
cout << "输入错误,请重新输入!" << endl;
exit(-1);
}
cout << "请输入图中所有的顶点:";
for (int i = 0; i < numT; i++) { //依次输入顶点的值
in >> tempV1;
R.insertVertex(tempV1);
}
cout << "输入图中的边数:";
in >> numE;
if (in.fail()) { //判断是否输入的是一个整数,如果不是,重新输入
cout << "输入错误,请重新输入!" << endl;
exit(-1);
}
cout << "输入图中的边,以“顶点1 顶点2 权值”的形式输入:" << endl;
for (int i = 0; i < numE; i++) {
in >> tempV1 >> tempV2 >> tempE; //输入格式:顶点1 顶点2 权值
tempIdx1 = R.getVertexPos(tempV1); //获取顶点1在顶点链表中的下标
tempIdx2 = R.getVertexPos(tempV2); //获取顶点2在顶点链表中的下标
if (!R.insertEdge(tempIdx1, tempIdx2, tempE)) { //插入边,如果未插入,提示错误信息
cout << "边输入错误,未找到相关的点!" << end