#include<iostream>
#define MVNum 100
using namespace std;
typedef char VerTexType;
typedef struct ArcNode{ //边结点
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode{ //头结点
VerTexType data;
ArcNode *firstarc;
}VNode,AdjList[MVNum];
typedef struct{ //图结构
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
int LocateVex(ALGraph G,VerTexType u){ //找结点u在顶点表中的序号
int i;
for(i=0;i<G.vexnum;i++)
if(u==G.vertices[i].data) return i;
return -1;
}
int CreateUDG(ALGraph &G){
int i,j,k;
cout<<"请输入总顶点数和总边数:";
cin>>G.vexnum>>G.arcnum;
cout<<"请输入各顶点:";
for(i=0;i<G.vexnum;i++){ //初始化顶点表
cin>>G.vertices[i].data;
G.vertices[i].firstarc=NULL;
}
for(k=0;k<G.arcnum;k++){
VerTexType v1,v2;
ArcNode *p1,*p2;
cout<<"请输入边依附的两个顶点:";
cin>>v1>>v2;
i=LocateVex(G,v1);
j=LocateVex(G,v2);
p1=new ArcNode; //新建边结点p1,头插法插入到第i个顶点后
p1->adjvex=j;
p1->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=p1;
p2=new ArcNode; //新建边结点p2,头插法插入到第j个顶点后
p2->adjvex=i;
p2->nextarc=G.vertices[j].firstarc;
G.vertices[j].firstarc=p2;
}
return 1;
}
void Show(ALGraph G){
int i;
for(i=0;i<G.vexnum;i++){
cout<<G.vertices[i].data<<' ';
if(G.vertices[i].firstarc){
ArcNode *p=G.vertices[i].firstarc;
while(p){
cout<<p->adjvex<<" ";
p=p->nextarc;
}
}
cout<<endl;
}
}
//DFS
bool visited[MVNum]; //辅助数组
void DFS(ALGraph G,int v){
cout<<G.vertices[v].data; visited[v]=true; //访问第v个结点
ArcNode *p=G.vertices[v].firstarc; //p初始值指向v结点的单链表
while(p!=NULL){ //p指针不为空
int w=p->adjvex; //w为邻接点
if(!visited[w]) DFS(G,w); //且w未被访问过,则递归DFS
p=p->nextarc; //指向下一条边
}
}
int main(){
ALGraph G;
CreateUDG(G);
cout<<"采用邻接表构造的无向图为:"<<endl;
Show(G);
cout<<"输入起点:";
int v;
cin>>v;
cout<<"邻接表的DFS为:";
DFS(G,v);
return 1;
}
运行结果: