#include<iostream>
using namespace std;
#define MAX_V_NUM 20
typedef char vextype;
int visited[20];`
typedef struct ArcNode{
int ver_index;
ArcNode* next;
}ArcNode;
typedef struct{
vextype data;
ArcNode* first;
}VerNode;
typedef struct{
VerNode adjlist[MAX_V_NUM];
int arcnum,vernum;
}Graph;
int firstadj(Graph g,int v)//返回邻接表指向的第一个顶点
{
int i;
for(i=0;i<g.vernum;i++){
if(i==v){
return g.adjlist[i].first->ver_index;
}
}
return -1;
}
int nextadj(Graph g,int v,int w)//返回相对于W的下一个顶点
{
int i;
ArcNode* p;
for(i=0;i<g.vernum;i++)
{
if(i==v){
p=g.adjlist[i].first;
while(p->ver_index!=w){
p=p->next;
}
p=p->next;
if(p==NULL){
return -1;
}
return p->ver_index;
}
}
return -1;
}
void DFS(Graph g,int v)
{
visited[v]=true;
cout<<char(v+65);
for(int w=firstadj(g,v);w!=-1;w=nextadj(g,v,w))
{
if(!visited[w]){
DFS(g,w);
}
}
}
void DFSTraverse(Graph g)
{
int v;
for(v=0;v<g.vernum;v++){
visited[v]=false;
}
for(v=0;v<g.vernum;v++){
if(!visited[v]){
DFS(g,v);//对位访问的顶点进行访问,防止有非连通图无法完全遍历
}
}
}
void creategraph(Graph &g)
{
int i,j,k;
char i1,j1;
ArcNode* p;
cout<<"n,e:";
cin>>g.vernum>>g.arcnum;
for(k=0;k<g.vernum;k++){
g.adjlist[k].data=char(k+65);
g.adjlist[k].first=NULL;
}
for(k=0;k<g.arcnum;k++){
cout<<"i,j:";
cin>>i1>>j1;
i=int(i1)-65;
j=int(j1)-65;
p=new ArcNode;
p->next=g.adjlist[i].first;
g.adjlist[i].first=p;
p->ver_index=j;
p=new ArcNode;
p->next=g.adjlist[j].first;
g.adjlist[j].first=p;
p->ver_index=i;
}
}
void show(Graph g)
{
int i;
ArcNode* p;
for(i=0;i<g.vernum;i++){
cout<<g.adjlist[i].data<<"\t";
p=g.adjlist[i].first;
while(p!=NULL){
cout<<p->ver_index<<"\t";
p=p->next;
}
cout<<endl;
}
}
int main()
{
Graph g;
creategraph(g);
show(g);
DFSTraverse(g);
return 0;
}
结果展示如下: