可以用深度優先遍歷法回到起始點,深度遍歷其實是壹種遞歸方法定義的,所以(單次)從哪個頂點開始就會在哪個定點結束,直到遍歷結束。以下是我寫的壹個從文件創建圖並深度優先遍歷輸出的例子,但運行之前妳要先在工程裏創建壹個圖的.txt文本文件,這裏即“data.txt”(因為不用文件的話每次運行都要從新輸入壹遍圖,好麻煩)
#include?<stdio.h>
#include?<malloc.h>
#include?<string.h>
#define?max_vertex_num?50
typedef?char?vertextype[10];
typedef?struct?arcnode{
int?adjvex;
struct?arcnode?*next;
}arcnode;
typedef?struct?vexnode{
vertextype?data;
arcnode?*firstarc;
}vexnode,adjlist[max_vertex_num];
typedef?struct{
adjlist?vertices;
int?vertexnum,edgenum;
}adjlistgraph;
int?visited[max_vertex_num];
int?locatevertex(adjlistgraph?G,vertextype?v);//找到頂點名稱所對應的序號
void?creatgraph(adjlistgraph?&G);//創建壹個圖
void?show_vertex(adjlistgraph?G);//顯示圖中所有頂點的信息
void?visit(adjlistgraph?G);//遍歷圖
void?DFS(adjlistgraph?G,int?v);//深度優先遍歷
int?main()
{
adjlistgraph?G;
creatgraph(G);
show_vertex(G);//顯示圖中頂點信息
printf("\n");
printf("\n");
printf("深度優先遍歷圖得:\n");
visit(G);
return?0;
}
int?locatevertex(adjlistgraph?G,vertextype?v)
{
int?i;
for(i=0;i<=G.vertexnum;i++)
if(strcmp(v,G.vertices[i].data)==0)
return?i;
return?-1;
}
void?creatgraph(adjlistgraph?&G)
{
FILE?*fp;
int?i,j;
vertextype?va,vb;
fp=fopen("data.txt","r");
fscanf(fp,"%d",&G.vertexnum);//從文件中輸入頂點個數
for(i=0;i<G.vertexnum;i++)//從文件中初始化頂點信息
{
fscanf(fp,"%s",&G.vertices[i].data);
G.vertices[i].firstarc=NULL;
}
fscanf(fp,"%d",&G.edgenum);//從文件中輸入邊數
for(j=0;j<G.edgenum;j++)//從文件中初始化邊
{
fscanf(fp,"%s%s",&va,&vb);
int?n=locatevertex(G,va);
int?m=locatevertex(G,vb);
arcnode?*p=(arcnode*)malloc(sizeof(arcnode));//n--->m
p->adjvex=m;
p->next=G.vertices[n].firstarc;
G.vertices[n].firstarc=p;
arcnode?*q=(arcnode*)malloc(sizeof(arcnode));//m--->n
q->adjvex=n;
q->next=G.vertices[m].firstarc;
G.vertices[m].firstarc=q;
}
fclose(fp);
}
void?show_vertex(adjlistgraph?G)
{
int?k;
printf("圖中的頂點為:\n");
for(k=0;k<G.vertexnum;k++)
{
printf("%-15s",G.vertices[k].data);
if((k+1)%5==0)
printf("\n");
}
}
void?visit(adjlistgraph?G)
{
for(int?i=0;i<G.vertexnum;i++)
visited[i]=0;
for(int?v=0;v<G.vertexnum;v++)
if(visited[v]==0)
{
DFS(G,v);
}
printf("\n");
}
void?DFS(adjlistgraph?G,int?v)
{
visited[v]=1;
printf("%s->",G.vertices[v].data);
for(arcnode?*p=G.vertices[v].firstarc;p;p=p->next)
if(visited[p->adjvex]==0)
DFS(G,p->adjvex);
}
隨便敲幾個點幾條邊進去,就可以運行了:
例如在data.txt中敲入:
4
北京
上海
杭州
昆明
5
北京?上海
上海?杭州
杭州?昆明
北京?昆明
上海?昆明
運行後結果為: