#include<iostream>
using namespace std;#defineMVNum100//最大顶点数#defineOK1#defineERROR0#defineOVERFLOW-2#defineMAXSIZE10typedefint Status;typedefstruct{char vexs[MVNum];//顶点表int arcs[MVNum][MVNum];//邻接矩阵int vexnum,arcnum;//顶点数和边数}AMGraph;/*返回顶点在顶点表中的位置*/intLocateVex(AMGraph G,char v){for(int i =0; i < G.vexnum;++i){if(v == G.vexs[i]){return i;}}}/*创建无向图*/
Status CreateUDN(AMGraph &G){
cout<<"请输入顶点数和边数"<<endl;
cin>>G.vexnum>>G.arcnum;//将顶点存入顶点表for(int i =0; i < G.vexnum;++i){
cout<<"输入第"<<(i+1)<<"顶点"<<endl;
cin>>G.vexs[i];}//初始化矩阵for(int j =0; j < G.vexnum;++j){for(int i =0; i < G.vexnum;++i){
G.arcs[j][i]=0;}}//初始化无向图for(int k =0; k < G.arcnum;++k){char v1,v2;
cout<<"输入第"<<k<<"边的两个顶点(空格隔开 例:a b)"<<endl;
cin>>v1>>v2;int i =LocateVex(G,v1);int j =LocateVex(G,v2);
G.arcs[i][j]=1;
G.arcs[j][i]=1;}return OK;}
bool visited[MVNum];/*深度优先遍历DFS*/voidDFS_AM(AMGraph G,int v,bool visited[]){
cout<<G.vexs[v];//将访问过的结点置为true
visited[v]= true;//依次检查v所在的行for(int w =0; w < G.vexnum;++w){//w是v的邻接点if(G.arcs[v][w]!=0&&(!visited[w]))DFS_AM(G,w,visited);}}typedefstruct{int*base;//存储空间的基地址int front;//头指针int rear;//尾指针}SqQueue;/*初始化队列*/
Status InitQueue(SqQueue &Q){
Q.base = new int[MAXSIZE];if(!Q.base)exit(OVERFLOW);//存储空间分配失败
Q.front = Q.rear =0;//头尾指针置零return OK;}/*循环队列入队*/
Status EnQueue(SqQueue &Q,int e){if((Q.rear+1)%MAXSIZE == Q.front)//(循环)队列满了return ERROR;
Q.base[Q.rear]= e;//在队尾插入元素
Q.rear =(Q.rear+1)%MAXSIZE;//队尾指针加1return OK;}/*循环队列出队*/
Status DeQueue(SqQueue &Q,int&e){if(Q.front == Q.rear)//对空return ERROR;
e = Q.base[Q.front];
Q.front =(Q.front+1)%MAXSIZE;//对头指针加1return OK;}
bool QueueEmpty(SqQueue Q){if(Q.front == Q.rear)return true;return false;}/*获取第一个邻接结点*/intFirstAdjVex(AMGraph G,int v){for(int i =0; i < G.vexnum;++i){if(G.arcs[v][i]!=0)return i;}}/*获取下一个邻接点*/intNextAdjVex(AMGraph G,int u,int w){for(int i = w+1; i < G.vexnum;++i){if(G.arcs[u][i]!=0)return i;}return-1;}/*广度优先遍历*/voidBFS_AM(AMGraph G,int v,bool visited[]){
cout<<G.vexs[v];
visited[v]= true;
SqQueue Q;InitQueue(Q);EnQueue(Q,v);while(!QueueEmpty(Q)){int u;DeQueue(Q,u);for(int w =FirstAdjVex(G,u); w >=0; w=NextAdjVex(G,u,w)){if(!visited[w]){
cout<<G.vexs[w];
visited[w]= true;EnQueue(Q,w);}}}}intmain(){
AMGraph G;CreateUDN(G);for(int i =0; i < MVNum;++i){
visited[i]= false;}
cout<<"深度优先算法"<<endl;DFS_AM(G,0,visited);for(int i =0; i < MVNum;++i){
visited[i]= false;}
cout<<endl<<"广度优先算法"<<endl;BFS_AM(G,0,visited);return0;}
测试
请输入顶点数和边数
56
输入第1顶点
a
输入第2顶点
b
输入第3顶点
c
输入第4顶点
d
输入第5顶点
e
输入第0边的两个顶点(空格隔开 例:a b)
a b
输入第1边的两个顶点(空格隔开 例:a b)
a d
输入第2边的两个顶点(空格隔开 例:a b)
c b
输入第3边的两个顶点(空格隔开 例:a b)
c d
输入第4边的两个顶点(空格隔开 例:a b)
c e
输入第5边的两个顶点(空格隔开 例:a b)
b e
深度优先算法
abcde
广度优先算法
abdce
Process finished withexit code 0