实验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;
}