15,440
社区成员
发帖
与我相关
我的任务
分享
#pragma once
#include"VertexNode.h"
#include"F:\QQPCmgr\documents\visual studio 2010\Projects\Graph\MinSpanTree\MSTEdgeNode.h"
#include<iostream>
#include<fstream>
using namespace std;
const int DefaultVertexNum = 30; //默认顶点最大数目 常量
template<class T, class E> //因为顶点是一个类型 边上的权值又是一个类型 所以声明了两个类型的模板
class GraphAdjList
{
protected:
int maxVerticseNum; //最大顶点数目
int numVertices; //当前顶点数目
int numEdges; //当前边数目
VertexNode<T,E> *nodeTable; //顶点顺序表
const T nullVertex; //顶点类型的NULL 用于找不到指定顶点的时候的返回值 在GraphAdjList类中是常量
const E nullEdge; //边类型的NULL(用边的权值表示边是否存在,如果是在正常范围内的E类型的值就说明存在边,否则就用一个很大很大的数据表示不存在边或是边是无穷远的)
static const int s_NULLidx = -1; //用来标示无法找到指定正确索引,返回-1 此写法是在C++2003标准出现的 在以后的编译器中均识别
public:
int GetVertexPos(const T &targetValue); //内部提供服务,根据传进来的参数返回该顶点所在的索引,如果失败则返回-1
int GetNullIdx(); //获取空索引标示
GraphAdjList(T nullver, E nulled, int vertexsize = DefaultVertexNum); //配置一个图
~GraphAdjList(); //析构
void MakeEmpty(); //销毁一个基于邻接表的图
T GetVertexValue(int vertex_idx); //获取指定索引的顶点的值 没有则返回nullVertex
T GetFirstNeighbor(const T &target_vertex); //获取以vertex为顶点的第一个邻接顶点值
T GetFirstNeighbor(int idx); //根据顶点索引获取顶点值
T GetNextNeighbor(const T &vertex, const T &adj_vertex); //获vertex的邻接顶点adj_vertex的下一个邻接顶点
T GetNextNeighbor(int idx, int adj_idx); //根据索引值获取指定邻接顶点的下一个顶点值
E GetEdgeWeight(const T &begvtx, const T &endvtx); //获取目标顶点begvtx,endvtx之间的权重值
E GetEdgeWeight(int begidx, int endidx); //重载
int GetVerticesNum(); //获取定点数目
int GetEdgesNum(); //获取边数目
T GetNullVertex(); //获取顶点空类型
E GetNullEdge(); //获取边空类型
bool InsertVertex(const T &target_vertex); //插入一个顶点 返回布尔值
bool InsertEdge(const T &begvtx, const T &endvtx, const E &weight); //在顶点begvtex,endvtx之间插入一条边(插入权重值) 返回布尔值
bool RemoveVertex(const T &target_vertex); //删除指定顶点,返回布尔值
bool RemoveEdge(const T &begvtx, const T &endvtx); //删除指定顶点之间的边,返回布尔值
void print(); //无参标准输出
void print(ostream &output); //输出这个图的信息
template<class T, class E> friend ifstream& operator>>(ifstream &fin, GraphAdjList<T,E> &G); //文件输入流重载
template<class T, class E> friend ofstream& operator<<(ofstream &fout, GraphAdjList<T,E> &G); //文件输出流重载
template<class T, class E> friend istream& operator>>(istream &input, GraphAdjList<T,E> &G); //标准输入流重载
template<class T, class E> friend ostream& operator<<(ostream &output, GraphAdjList<T,E> &G); //标准输出流重载
//template<class T, class E> friend void DepthFirstSearch(GraphAdjList<T,E> &targetG, const T &begigVertex, void(Fun *)(VertexNode<T,E> &));
//template<class T, class E> friend void Sub_DPS(GraphAdjList<T,E> &targetG, int local_idx, bool * &visit);
void GetAllEdgesInformation(MSTEdgeNode<E> * &arr); //返回所有的边信息
};
还有啊,就是很多人都说数据结构很重要,重要在哪里我有一些了解,可是怎么学习的过程中怎么才算把数据结构学好了呢?我所有的结构都是自己手敲一遍而且觉得都是用的模板,自己的泛型编程也了解了点。这样子配合学怎么样啊?那个STL在学C++的时候仅仅是用过一些基本容器,现在用基本的数据结构,但是用的不多。