#include<stdio.h>
#include<iostream.h>
#define MAX 100
#define N 100
typedef struct
{
char v[N];
}A;
typedef struct node //邻接表表结点
{
int adjvex; //邻接点域
struct node * next; //指向下一个邻接点的指针域
int juli; //表示边上信息
}EdgeNode;
typedef struct vnode //表头结点
{
A a; //存结点信息
EdgeNode * firstedge; //边表头指针
}VertexNode;
typedef struct
{
VertexNode adjlist[MAX];
int visited[MAX];
int n,e; /*顶点数和边数*/
}ALGraph;
void createALGraph(ALGraph *G) //创建邻接表
{
printf("请分别输入要访问的城市个数和总共的道路数:\n");//顶点、边
cin>>G->n>>G->e;
printf("定义一个起始城市,输入它,从它开始,按自己规定的顺序依次输入其余城市名称:\n");
for (int i = 0; i < G->n ; i++) //建立有n个顶点的顶点表
{
scanf("%s",G->adjlist[i].a.v); //读入顶点信息
G->adjlist[i].firstedge = NULL; //顶点的边表头指针设为空
}
/* EdgeNode *s;
int m,n;
printf("请从你定义的起始城市开始,输入每一条道路它所连接的前后的两个城市以及它们的距离:\n");
for (int k=0; k<G->e; k++)
{
cin>>G->adjlist->firstedge.juli;
s = new EdgeNode; //生成新边表结点s
s->adjvex = n; //邻接点序号为n
s->next = G->adjlist[m].firstedge; //将新边表结点s用头插法插入到顶点Vi 的边表头部
G->adjlist[m].firstedge = s;
}*/
}
void DFSAL(ALGraph *G, int i) //深度优先遍历
{
cout<<"第"<<i+1<<"个城市"<<":"<<G->adjlist[i].a.v<<endl; //访问顶点信息
G->visited[i]=1; //标记vi已访问
EdgeNode *p;
p=G->adjlist[i].firstedge; //取vi边表的头指针
while(p) //如果p不空,依次搜索vi的邻接点vj
{
if (G->visited[p->adjvex]==0) //若vj尚未访问,则以vj为出发点向纵深搜索
DFSAL(G,p->adjvex);
p=p->next; //找vi的下一个邻接点
}
}
void DFS(ALGraph *G)
{
int i;
for (i=0; i<G->n; i++)
G->visited[i]=0; /*标志向量初始化*/
for (i=0; i<G->n; i++) //vi未访问过,从vi开始DFS搜索
if (G->visited[i]==0)
DFSAL(G,i);
}
/*************************************************************/
int main()
{
printf("2:以邻接表为储存方式的深度优先搜索\n");
ALGraph G;
printf("现在开始构建邻接表!\n");
createALGraph(&G);
printf("现在开始Depth-First-Search!\n");
DFS(&G);
}
大同 北京 济南 郑州 西安 太原 石家庄
大同—北京,其间距离379 大同—太原,其间距离355 北京—济南,其间距离298 北京—石家庄,其间距离283 济南—郑州,其间距离615 济南—石家庄,其间距离298 郑州—西安,其间距离620 郑州—石家庄,其间距离412 西安—太原,其间距离1554 西安—石家庄,其间距离1552 太原—石家庄,其间距离340
1 2 379 1 6 355 2 3 298 2 7 283 3 4 615 3 6 298 4 5 620 4 7 412 5 6 1554 5 7 1552 6 7 340
//队列
2 379 0
6 355 1
3 298 0
7 283 1
4 615 0
6 298 1
5 620 0
7 412 1
6 1554 0
7 1552 1
7 340 1