/****深度优先 非递归算法***/——————————运行环境 DEV– C++5.0
#include<iostream>
using namespace std;
const int maxsize=20;
template<class T>
class MGraph
{
public:
MGraph(T a[],int n,int e);//够着函数
~MGraph(){}
/*T getvex(int i);
void putvex(int i,T value);
void insertvex(int i,T value);
void Deletevex(int i);
void insertarc(int i,int j);
void Deletearc(int i,int j);*/
void dfstraverse(int v);//深度优先遍历
void bfstraverse(int v);//广度优先遍历
private:
T vertex[maxsize];//结点的信息
int arc[maxsize][maxsize];//存储边的信息,有边为1
int vertexnum,arcnum;//结点数目,边的条数
};
template<class T>
MGraph<T>::MGraph(T a[],int n,int e)
{
int i,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;
cout<<“边的信息”<<endl;
for(k=0;k<arcnum;k++)
{
cout<<“第”<<k+1<<“条边”;
cin>>i>>j;
arc[i][j]=1;
arc[j][i]=1;
}
}
template<class T>
void MGraph<T>::dfstraverse(int v)//从第V个位置开始遍历
{
int j,top;
int stack[vertexnum],visited[vertexnum];//stack是定义的堆栈,visited是用来纪律结点是否被访问,访问值为1
cout<<vertex[v];//输出第V的结点的信息
top=-1;//初始堆栈栈顶
visited[v]=1;//第v个结点被访问
stack[++top]=v;//入栈
j=0;
while(top!=-1)//栈为空,遍历结束
{
if(arc[v][j]==1&&visited[j]!=1)//遍历未被访问的结点,并入栈
{
cout<<vertex[j];
stack[++top]=j;
visited[j]=1;
j=0;
}
j++;
if(j==vertexnum||visited[v]==1)//出栈和取栈顶的条件
{
v=stack[top];//深度遍历的下一个结点已经在栈顶
if(j==vertexnum)//栈顶变化的条件
{
top–;
j=0;//栈顶变化后,j也变化
}
}
}
}
template<class T>
void MGraph<T>::bfstraverse(int v)
{
int front,rear,j,visited[vertexnum];
int q[100];
front=rear=-1;
cout<<vertex[v];visited[v]=1;q[++rear]=v;
while(front!=rear)
{
v=q[++front];
for(j=0;j<vertexnum;j++)
if(arc[v][j]==1&&visited[j]!=1)
{cout<<vertex[j];
visited[j]=1;
q[++rear]=j;}
}
}
/***深度优先 递归****/
template<class T>
void MGraph<T>::dfstraverse(int v)
{
int j,top;
cout<<vertex[v];
vs[v]=1;
for(j=0;j<vertexnum;j++)
if(arc[v][j]==1&&vs[j]!=1)dfstraverse(j);
}
/***主函数***/
int main()
{ char a[10];
int n;
int e,i;
cout<<“结点数目 和 边得条数”;
cin>>n>>e;
cout<<“结点信息”;
for(i=0;i<n;i++)
cin>>a[i];
MGraph<char> s(a,n,e);
cout<<endl<<“广度优先遍历”;
s.bfstraverse(0);
cout<<endl<<“深度优先遍历”;
s.dfstraverse(0);
system(“pause”);
}