问题描述 :
目的:使用C++模板设计并逐步完善图的邻接表抽象数据类型(ADT)。
内容:(1)请参照图的邻接矩阵模板类原型,设计并逐步完善图的邻接表ADT。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。)
(2)设计并实现一个算法,在已存在的图中检查指定的两个端点是否为邻接顶点。如是,返回true;否则返回false。图的存储结构采用邻接表。将其加入到ADT中。
注意:DG(有向图), DN(有向网), UDG(无向图), UDN(无向网)
参考函数原型:
//检查指定2个顶点是否是邻接顶点
template<class TypeOfVer, class TypeOfEdge>
bool adjlist_graph<TypeOfVer, TypeOfEdge>::ExistEdge(int u, int v);
输入说明 :
建图的输入数据格式参见建图的算法说明。(以无权图为例)
第一行:图的类型
第二行:结点数
第三行:结点集
第四行:边数
第五行:边集
第六行:顶点u
第七行:顶点v
输出说明 :
第一行:顶点集
第二行:邻接表
空行
第三行:true(false)
输入范例 :
UDG
6
A B C D E F
6
0 1
0 2
1 3
2 3
3 4
3 5
0
2
输出范例 :
A B C D E F
A->2->1->nullptr
B->3->0->nullptr
C->3->0->nullptr
D->5->4->2->1->nullptr
E->3->nullptr
F->3->nullptr
(空行)
true
#include<iostream>
#include<vector>
#include<string>
#include<sstream>
#include<queue>
#include<stack>
#include<cmath>
using namespace std;
string b[10001];//用来存放顶点集
//DG(有向图) DN(有向网) UDG(无向图) UDN(无向网)
//图的邻接表模板类原型参考如下:
//边表的顶点定义
template<class TypeOfEdge>//这个就是在边上的顶点定义
struct edgeNode{
int data;
TypeOfEdge weight;
edgeNode<TypeOfEdge> *next;
//构造函数,用于构造其他顶点(无权图)
//函数参数表中的形参允许有默认值,但是带默认值的参数需要放后面
edgeNode(int d,edgeNode<TypeOfEdge> *ptr=NULL){
data=d;next=ptr; }
//构造函数,用于构造其他顶点(带权图)
//函数参数表中的形参允许有默认值,但是带默认值的参数需要放后面
edgeNode(int d,TypeOfEdge w,edgeNode<TypeOfEdge> *ptr=NULL){
data=d; weight=w; next=ptr;
}
int getData(){
return data; }//取得顶点的序号(顶点集)
TypeOfEdge getWeight(){
return weight; }//取得边集中对应边的权值
void SetLink(edgeNode<TypeOfEdge> *link ){
next=link; }//修改顶点的next域
void SetData(int value){
data=value; }//修改顶点的序号(顶点集)
void SetWeight(TypeOfEdge value){
weight=value; }//修改边集中对应边的权值
};
//图的邻接表类 这个结构体是存储顶点的结构体,里面包括顶点和它的下一个指针
template<class TypeOfVer,class TypeOfEdge>
struct verNode{
TypeOfVer ver;//存放顶点名称
edgeNode<TypeOfEdge> *head;//顶点的指针
verNode(edgeNode<TypeOfEdge> *h=NULL){
head=h; }
TypeOfVer getVer(){
return ver; }//取得顶点值(顶点集)
edgeNode<TypeOfEdge> *getHead(){
return head; }//取得对应的边表的头指针
void setVer(TypeOfVer value){
ver=value; }//设置顶点值(顶点集)
void setHead(edgeNode<TypeOfEdge> *value){
head=value; }//设置对应的边表的头指针
};
template<class TypeOfVer,class TypeOfEdge>//顶点类型 边的类型
class adjlist_graph{
private:
int Vers;//顶点数
int Edges;//边数
string GraphKind;//图的种类标志
verNode<TypeOfVer,TypeOfEdge> *verList;//按顺序存储结构存储顶点集
bool Delete_Edge(int u,int v);
bool DFS(int u,int num,int visited[]);//DFS遍历(递归部分)
public: