这个程序是关于图的遍历算法的 编程风格有点不美观 来自于http://wenku.baidu.com/view/8f5ad239376baf1ffc4fad92.html
#include<iostream>
#define INFINITY 32767
#define MAX_VEX 20//最大顶点数
#define QUEUE_SIZE (MAX_VEX+1) //队列长度
using namespace std;
bool * visited;//访问标志数组
//图的邻接矩阵存储结构
typedef struct
{
char * vexs;//顶点向量
int arcs[MAX_VEX][MAX_VEX];//邻接矩阵
int vexnum,arcnum;//图的当前顶点数和弧数
}Graph;
//队列类
class Queue//循环队列(数组)
{
public:
void InitQueue()
{
base=new int[QUEUE_SIZE];
front=rear=0;
}
void EnQueue(int e)
{
base[rear]=e;
rear=(rear+1)%QUEUE_SIZE;
}
void DeQueue(int & e)
{
e=base[front];
front=(front+1)%QUEUE_SIZE;
}
public:
int * base;
int front;
int rear;
};
//图G中查找元素c的位置
int Locate(Graph G,char c)
{
for(int i=0;i<G.vexnum;i++)
if(G.vexs[i]==c)
return i;
return -1;
}
//创建无向网
void CreateUDN(Graph & G)
{
int i,j,w,s1,s2;
char a,b,temp;
printf("输入顶点数和弧数:");
scanf("%d%d",&G.vexnum,&G.arcnum);
temp=getchar();//接收回车
G.vexs=new char;
printf("输入%d个顶点.\n",G.vexnum);
for(i=0;i<G.vexnum;i++)//初始化顶点
{
printf("输入顶点%d:",i);
scanf("%c",&G.vexs[i]);
temp=getchar();
}
for(i=0;i<G.vexnum;i++)//初始化邻接矩阵
for(j=0;j<G.vexnum;j++)
G.arcs[i][j]=INFINITY;
printf("输入%d条弧.\n",G.arcnum);
for(i=0;i<G.arcnum;i++)//初始化弧
{
printf("输入弧%d:",i);
scanf("%c %c %d",&a,&b,&w);//输入一条边依附的顶点和权值
temp=getchar();
s1=Locate(G,a);
s2=Locate(G,b);
G.arcs[s1][s2]=G.arcs[s2][s1]=w;
}
}
//图G中顶点k的第一个邻接点
int FirstVex(Graph G,int k)
{
if(k>=0 && k<G.vexnum)
{
for(int i=0;i<G.vexnum;i++)
if(G.arcs[k][i]!=INFINITY)
return i;
}
return -1;
}
//图G中顶点i的第j个邻接顶点的下一个邻接顶点
int NextVex(Graph G,int i,int j)
{
if(i>=0 && i<G.vexnum && j>=0 && j<G.vexnum)
{
for(int k=j+1;k<G.vexnum;k++)
if(G.arcs[i][k]!=INFINITY)
return k;
}
return -1;
}
//深度优先遍历
void DFS(Graph G,int k)
{
int i;
if(k==-1)//第一次执行DFS时,k为-1
{
for(i=0;i<G.vexnum;i++)
if(!visited[i])
DFS(G,i);//对未访问的顶点调用DFS
}
else
{
visited[k]=true;
printf("%c",G.vexs[k]);//访问第k个顶点
for(i=FirstVex(G,k);i>=0;i=NextVex(G,k,i))
if(!visited[i])
DFS(G,i);//对k的尚未访问的邻接点i递归调用DFS
}
}
//广度优先搜索
void BFS(Graph G)
{
int k,i=0;
Queue Q;
Q.InitQueue();
if(!visited[i])//i尚未访问
{
visited[i]=true;
printf("%c",G.vexs[i]);
Q.EnQueue(i);//i入队
while(Q.front!=Q.rear)//如果队列不空
{
Q.DeQueue(k);
for(int w=FirstVex(G,k);w>=0;w=NextVex(G,k,w))
if(!visited[w])
{
visited[w]=true;
printf("%c",G.vexs[w]);
Q.EnQueue(w);
}
}
}
}
//主函数
int main()
{
int i;
Graph G;
CreateUDN(G);
visited=(bool*)malloc(G.vexnum*sizeof(bool));
printf("\n深度优先遍历:");
for(i=0;i<G.vexnum;i++)
visited[i]=false;
DFS(G,-1);
printf("\n广度优先遍历:");
for(i=0;i<G.vexnum;i++)
visited[i]=false;
BFS(G);
printf("\n程序结束.\n");
}