数据结构实验六 信管117121刘愿

实验6:图的实验1-图的邻接矩阵存储实现

邻接矩阵的实现

#ifndef MGraph_H

#define MGraph_H

const int MaxSize=10;

template<class DataType>

class MGraph

{

       public:

              MGraph(DataTypea[],int n,int e);

              ~MGraph(){}

              voidDFSTraverse(int v);

              voidBFSTraverse(int v);

       private:

              DataTypevertex[MaxSize];

              int arc[MaxSize][MaxSize];

              intvertexNum,arcNum;

};

#endif

#include<iostream>

using namespace std;

#include"MGraph.h"

template<class DataType>

MGraph<DataType>::MGraph(DataTypea[],int n,int e)

{

       inti,j,k;

       vertexNum=n;arcNum=e;

       for(i=0;i<vertexNum;i++)

              vertex[i]=a[i];

       for(i=0;i<vertexNum;i++)

for(j=0;j<vertexNum;j++)

              arc[i][j]=0;

for(k=0;k<arcNum;k++)

{

       cout<<"请输入边的两个顶点的序号:";

       cin>>i>>j;

       arc[i][j]=1;arc[j][i]=1;

}

}

template<class DataType>

voidMGraph<DataType>::DFSTraverse(int v)

{

       cout<<vertex[v];visited[v]=1;

       for(intj=0;j<vertexNum;j++)

              if(arc[v][j]==1&&visited[j]==0)

                     DFSTraverse(j);

}

template<class DataType>;

voidMGragh<DataType>::BFSTraverse(int v);

{

       intQ[MaxSize];

       intfront =-1,rear=-1;

       cout<<vertex[v];visited[v]=1;Q[++rear]=v;

       while(front!=rear)

       {

              v=Q[++front];

              for(intj=0;j<vertexNum;j++)

                     if(arc[v][j]==1&&visited[j]==0){

                            cout<<vertex[j];visited[j]=1;Q[++rear]=j;

                     }

       }

}

#include<iostream>

using namespace std;

#include"MGraph.cpp"

int visited[MaxSize]={0};

int main()

{

       charch[]={'A','B','C','D','E'};

       MGraph<char>MG(ch,5,6);

       for(inti=0;i<MaxSize;i++)

              visited[i]=0;

       cout<<"深度优先遍历序列是:";

       MG.DFSTraverse(0);

       cout<<endl;

       for(i=0;i<MaxSize;i++)

              visited[i]=0;

       cout<<"广度优先遍历序列是:";

       MG.BFSTraverse(0);

       cout<<endl;

       return0;

}

邻接表的实现

#ifndef ALGraph_H

#define AJGraph_H

const int MaxSize=10;

struct ArcNode

{

       intadjvex;

       ArcNode*next;

};

template<class DataType>;

struct VertexNode

{

       DataTypevertex;

       ArcNode*firstedge;

};

template<class DataType>;

class ALGraph

{

public:

       ALGraph(DataTypea[],int n,int e);

       ~ALGraph();

       voidDFSTraverse(int v);

       voidBFSTraverse(int v);

private:

       VertexNode<DataType>adjlist[MaxSize];

       intvertexNum,arcNum;

};

#endif

#include<iostream>

using namespace std;

#include"ALGraph.h"

template<class DataType>

ALGraph<DataType>::ALGraph(DataTypea[],int n,int e)

{

       ArcNode*s;

       inti,j,k;

       vertexNum=n;arcNum=e;

       for(i=0;i<vertexNum;i++)

       {

              adjlist[i].vertex=a[i];

              adjlist[i].firstedge=NULL;

       }

       for(k=0;k<arcNum;k++)

       {

              cout<<"请输入边的两个顶点的序号:";

              cin>>i>>j;

              s=newArcNode;s->adjvex=j;

              s->next=adjlist[i].firstedge;

              adjlist[i].firstedge=s;

       }

}

template<class DataType>

ALGraph<DataType>::~ALGraph()

{

       ArcNode*p=NULL;

       for(inti=0;i<vertexNum;i++)

       {

              p=adjlist[i].firstedge;

              while(p!=NULL)

              {

                     adjlist[i].firstedge=p->next;

                     deletep;

                     p=adjlist[i].firstedge;

              }

       }

}

template<class DataType>

voidALGraph<DataType>::DFSTraverse(int v)

{

       ArcNode*p=NULL;int j;

       cout<<adjlist[v].vertex;visited[v]=1;

       p=adjlist[v].firstedge;

       while(p!=NULL)

       {

              j=p->adjvex;

              if(visited[j]==0)DFSTraverse(j);

              p=p->next;

       }

}

template<class DataType>

voidALGraph<DataType>::BFSTraverse(int v)

{

       intQ[MaxSize];

       intfront =-1,rear =-1;

       ArcNode*p=NULL;

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

       while(front!=rear)

       {

              v=Q[++front];

              p=adjlist[v].firstedge;

              while(p!=NULL)

              {

                     intj=p->adjvex;

                     if(visitesd[j]==0){

                            cout<<adjlist[j].vertex;visited[j]=1;Q[++rear]=j;

                     }

                     p=p->next;

              }

       }

}

#include<iostream>

using namespace std;

#include "ALGraph.cpp"

int visited[MaxSize]={0};

int main()

{

       charch[]={'A','B','C','D','E'};

       inti;

       ALGraph<char>ALG(ch,5,6);

       for(i=0;i<MaxSize;i++)

              visited[i]=0;

       cout<<"深度优先遍历序列是:";

       ALG.DFSTraverse(0);

       cout<<endl;

       for(i=0;i<MaxSize;i++)

              visited[i]=0;

       cout<<"广度优先遍历序列是:";

       ALG.BFSTraverse(0);

       cout<<endl;

       return0;

}



猜你喜欢

转载自blog.csdn.net/qq920896923/article/details/80472850