数据结构之图的邻接表表示(GraphLink)源文件

本文档介绍了使用C++实现图的邻接表数据结构,包括`GraphLink.h`头文件的定义和`main.cpp`测试文件的详细内容,通过测试展示了数据结构的正确性。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值