當前位置:成語大全網 - 新華字典 - c語言中用什麽遍歷可以在遍歷所有頂點後回到起始點

c語言中用什麽遍歷可以在遍歷所有頂點後回到起始點

可以用深度優先遍歷法回到起始點,深度遍歷其實是壹種遞歸方法定義的,所以(單次)從哪個頂點開始就會在哪個定點結束,直到遍歷結束。以下是我寫的壹個從文件創建圖並深度優先遍歷輸出的例子,但運行之前妳要先在工程裏創建壹個圖的.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

北京?上海

上海?杭州

杭州?昆明

北京?昆明

上海?昆明

運行後結果為: