有向图邻接表的实现

#include <iostream>
using namespace std;
const int maxsize=10;
int visited[maxsize]={0};
struct ArcNode//定义边表节点
{
    int adjvex;//邻接点域
    ArcNode *next;
};
template<class DataType>
struct VertexNode//定义顶点表结点
{
    DataType vertex;
    ArcNode *firstedge;
};
template<class DataType>
class ALGraph
{
  public:
  ALGraph(DataType a[],int n,int e);
  //~ALGraph();
  void DFSTraverse(int v);//深度优先遍历
  void BFSTraverse(int v);//广度优先遍历
  private:
  VertexNode<DataType> adjlist[maxsize];//存放顶点表的数组
  int vertexNum,arcNum;//图的顶点数和边数
};

template<class DataType>
ALGraph<DataType>::ALGraph(DataType a[],int n,int e)
{
    ArcNode * s;

    vertexNum=n;
    arcNum=e;
    for(int i=0;i<vertexNum;i++)//存储顶点信息,初始化顶点表
    {
        adjlist[i].vertex=a[i];
        adjlist[i].firstedge=NULL;
    }
    for(int k=0;k<arcNum;k++)
    {
        int x,y;
        cout<<"请输入边的两个顶点的序号:";//输入边所依附的两个顶点的编号
        cin>>x>>y;

        s=new ArcNode;s->adjvex=y;//生成一个边表节点s
        
        s->next=adjlist[x].firstedge;

        adjlist[x].firstedge=s;//将结点s插入到第i个边表的表头
    }
}

template<class DataType>
void ALGraph<DataType>::DFSTraverse(int v)
{
    cout<<adjlist[v].vertex;visited[v]=1;
    ArcNode *p=NULL; p=adjlist[v].firstedge;
    int j;
    while(p!=NULL)
    {
        j=p->adjvex;
        if(visited[j]==0)DFSTraverse(j);
        p=p->next;

    }
}
template <class DataType>
void ALGraph<DataType>::BFSTraverse(int v)
{
   int Q[maxsize];
   int rear=-1,front=-1;//1.初始化队列
   ArcNode *p=NULL;

   cout<<adjlist[v].vertex;
   visited[v]=1;
   Q[++rear]=v;//2.

   while(front!=rear)
   {
       v=Q[++front];
       p=adjlist[v].firstedge;
       while(p!=NULL)
       {
           int j=p->adjvex;
           if(visited[j]==0)
           {
               cout<<adjlist[j].vertex;
               visited[j]=1;
               Q[++rear]=j;
           }
           p=p->next;
       }
   }
}
int main()
{
    char ch[]={'0','1','2','3','4','5'};
    int i;
    ALGraph<char>ALG(ch,6,8);
    for(i=0;i<maxsize;i++)//初始化图中所有结点都未被访问
    visited[i]=0;
    cout<<"广度优先遍历序列是:";
    ALG.BFSTraverse(0);
    cout<<endl;
   for(i=0;i<maxsize;i++)//初始化图中所有结点都未被访问
    visited[i]=0;

    ALGraph<char>ALG1(ch,6,6);
    cout<<"深度优先遍历序列是:";
    ALG1.DFSTraverse(0);
    cout<<endl;
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值