¿Qué recorrido se utiliza en lenguaje C para volver al punto de partida después de atravesar todos los vértices?
Puede utilizar el método de recorrido en profundidad primero para regresar al punto inicial. El recorrido en profundidad en realidad se define mediante un método recursivo, por lo que (simple) el vértice desde el que comience terminará en el punto fijo hasta el punto. final del recorrido.
El siguiente es un ejemplo que escribí sobre la creación de un gráfico a partir de un archivo y el recorrido en profundidad de la salida, pero antes de ejecutarlo, primero debe crear un archivo de texto .txt del gráfico en el proyecto, aquí está "data.txt". (porque si no usa un archivo, cada vez debe volver a ingresar la imagen antes de ejecutar, lo cual es muy problemático)
#include?lt;stdio.hgt;
#include?lt; malloc.hgt;
#include?lt;string.hgt;
#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{
p>
adjlist?vertices;
int?vertexnum,edgenum;
}adjlistgraph;
int?visited[max_vertex_num];
int?locatevertex(adjlistgraph?G,vertextype?v);//Encuentra el número de serie correspondiente al nombre del vértice
void?creatgraph(adjlistgraph?amp;G);//Crear un gráfico
p>void?show_vertex(adjlistgraph?G); //Mostrar información sobre todos los vértices en el Graph
void?visit(adjlistgraph?G); //Recorre el gráfico
void?DFS(adjlistgraph?G, int?v); //Recorrido en profundidad
p>int?main()
{
adjlistgraph?G;
creatgraph(G);
show_vertex( G); //Muestra información de vértices en el gráfico
printf("\n");
printf("\n"); "Recorrido en profundidad del gráfico: \n");
visit(G
return?0;
}
<); p>int?locatevertex(adjlistgraph?G, vertextype?v){
int
for(i=0;ilt;=G .vertexnum;i)
if(strcmp(v,G.vertices[i].data)==0)
p>return?i;
return?-1;
}
void?creatgraph(adjlistgraph?amp;G)
{
ARCHIVO?*fp ;
int?i, j;
vertextype?va,
fp =fopen("datos;
.txt", "r");
fscanf(fp, "d", amp; G.vertexnum); //Ingrese el número de vértices del archivo
for( i =0; ilt; G.vertexnum; i )//Inicializa la información del vértice del archivo
{
fscanf(fp, "s", amp; G.vertices[i ] .data);
G.vertices[i].firstarc=NULL;
}
fscanf(fp, "d", amp; G. edgenum ); //Ingrese el número de borde del archivo
for(j=0;jlt;G.edgenum;j)//Inicialice el borde del archivo
{
fscanf(fp, "ss", amp; va, amp; vb);
int?n=locatevertex(G, va, amp; vb); m=locatevertex (G, vb);
arcnode?*p=(arcnode*)malloc(sizeof(arcnode)); //n---gt; -gt; adjvex=m;
p-gt; siguiente=G.vertices[n].firstarc;
G.vertices[n].firstarc=p;
arcnode?*q=(arcnode*)malloc(sizeof(arcnode));//m---gt;n
q-gt;adjvex=n;
q -gt; next=G.vertices[m].firstarc;
G.vertices[m].firstarc=q;
}
fclose(fp );
}
void?show_vertex(adjlistgraph?G)
{
int?k;
printf("Los vértices del gráfico son:\n");
for(k=0;klt;G.vertexnum;k)
{ p>
printf("-15s", G.vertices[k].data);
if((k 1)5==0)
printf(" \n") ;
}
}
void?visita(adjlistgraph?G)
{
for(int ?i=0; ilt; G.vertexnum; i )
visitó[i]=0;
for (int?v=0; vlt; G. vertexnum; v )
if(visitado[v]==0)
{
DFS(G, v)
}
printf("\n");
}
void?DFS(adjlistgraph?G, int?v)
{
visitó[v]=1;
printf("s-gt;", G.vertices[v].data);
for( nodo de arco?*p =G.vertic
es[v].firstarc;p;p=p-gt;next)
if(visitado[p-gt;adjvex]==0)
DFS(G,p -gt; adjvex);
}
Simplemente escriba algunos puntos y aristas y se ejecutará:
Por ejemplo, escriba data.txt Introduzca:
4
Pekín
Shanghai
Hangzhou
Kunming
5
¿Pekín? ¿Shanghai?
¿Hangzhou?
¿Pekín Kunming?
El resultado después de ejecutar es: