邻接表:两个顶点是否相邻

问题描述 :
目的:使用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:
       
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_房似锦_

好心人哇!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值