以下是源代码:
#include<iostream>
using namespace std;
#define MAX_VERTEX_NUM 20
typedef int EdgeData;
typedef char VertexData; //顶点数据域
typedef struct node { // 边表节点
EdgeData cost; //边上d权值
int adjvex; //邻接点域
struct node *next; //下一边链接指针
}EdgeNode;
typedef struct { // 顶点表
VertexData vertex; //顶点数据域
EdgeNode *firstEdge; // 边链表头指针
}VertexNode;
typedef struct { // 图的邻接表
VertexNode verlist[MAX_VERTEX_NUM] ;
int vexnum,edgenum; //顶点数和边数
}AdjGraph;
void printAdjGraph(AdjGraph G){
cout<<"得到的有向图如下:"<<endl;
int i ;
for(i = 0;i<G.vexnum;i++){
cout<<G.verlist[i].vertex<<"-->";
EdgeNode *e = G.verlist[i].firstEdge;
while(e!=NULL){
cout<<e->adjvex<<"-->";
e = e->next;
}
cout<<endl;
}
}
//建立图的邻接表
AdjGraph createAdjGraph(AdjGraph G){
int i,j,k,w;
cout<<"输入顶点数和边数"<<endl;
cin>>G.vexnum>>G.edgenum;
cout<<"输入顶点信息"<<endl;
for(i = 0 ; i<G.vexnum;i++){
cin>>G.verlist[i].vertex;
G.verlist[i].firstEdge = NULL; //将边表置为空表
}
EdgeData weight;
int head;
int tail;
cout<<"输入第tail号边表的前端索引head,和权值weight,如(tail head weight)"<<endl;
for(k=0;k<G.edgenum;k++){
cin>>tail>>head>>weight;
EdgeNode *p = new EdgeNode;
p->adjvex = head;
p->cost = weight;
p->next = G.verlist[tail].firstEdge;
G.verlist[tail].firstEdge = p; // 一条边是 tail---->head
//创建无向图的话就再加上下面的代码
// p = new EdgeNode;
// p->adjvex = tail;
// p->cost = weight;
// p->next = G.verlist[head].firstEdge;
// G.verlist[head].firstEdge = p;
if(k==G.edgenum-1)
printAdjGraph(G);
}
return G;
}
bool visited[MAX_VERTEX_NUM] ;
int dfn[MAX_VERTEX_NUM]; //顶点的先深编号
int count = 1;
void DFS1(AdjGraph G,int i){
EdgeNode *p;
cout<<G.verlist[i].vertex<<endl;
visited[i] = true;
dfn[i] = count++;
p = G.verlist[i].firstEdge;
while(p){
if(!visited[p->adjvex])
DFS1(G,p->adjvex);
p = p->next;
}
//若是邻接矩阵则用下面的程序替代while(p)程序段
// for(j=0;j<G.vexnum;j++)
// if(G.egde[i][j]==1 && !visited[i])
// DFS2(G,j);
//
}
//深度优先遍历主程序
void DFSTraverse(AdjGraph G){
int i ;
for(i=0;i<G.vexnum;i++)
visited[i]=false;
for(i=0;i<G.vexnum;i++)
if(!visited[i])
DFS1(G,i);
}
main(){
AdjGraph G ;
G = createAdjGraph(G);
cout<<"深度优先遍历的结果:"<<endl;
DFSTraverse(G);
system("pause");
}
程序运行结果截图