Creación de gráficos no dirigidos (matriz de adyacencia) y programa de recorrido en profundidad (C)
(2) Inicie un recorrido de búsqueda en profundidad desde el vértice especificado.
(3) Recorrido de búsqueda en amplitud comenzando desde el vértice especificado.
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
# incluya "math.h"
#define MAX_INT 1000
#define MAX_VERTEX_NUM 20
#define MAX_QUEUE_NUMBER 20
typedef struct ArcNode
{
int adjvex;
doble adj;
estructura ArcNode *nextarc
}ArcNode; /p>
typedef struct VexNode
{
char szName[40];
ArcNode *firstarc;
}VexNode ,AdjList[MAX_VERTEX_NUM];
typedef struct
{
AdjList vexs;
int vexnum,arcnum;
}Net;
// Definir cola
typedef struct{
int *elem;
int front, rear;
}Cola;
void InitQueue(Cola &Q)
{
Q.elem = new int[MAX_QUEUE_NUMBER];
Q.front = Q.rear = 0;
}
int EmptyQueue(Cola Q)
{
if(Q.front==Q.rear)
Devuelve 0
En caso contrario
Devuelve 1
}
void DestroyQueue(Cola &Q){
eliminar []Q.elem;
Q.front = Q.rear = 0;
}
void EnterQueue(Queue &Q, int e)
{
if ((Q.trasero + 1)%MAX_QUEUE_NUMBER ! = Q.front) p>
Q.elem[Q.rear ] = e;
else
printf("¡Cola llena!\n");
Q .rear = (Q.rear + 1)%MAX_QUEUE_NUMBER !rear + 1)%MAX_QUEUE_NUMBER;
}
void LeaveQueue(Cola &Q, int &e)
{
if(Q.trasero ! = Q.frontal)
e = Q.elem[Q.frontal];
else
printf("¡Cola vacía! \n");
Q.front = (Q.front+1)%MAX_QUEUE_NUMBER;
}
int LocateVex(Net ga,char *nombre )
{
int i;
p>
for(i=0;i& lt;ga.vexnum;i++)
if(strcmp(nombre,ga.vexs[i].szName)==0)
Devolver i;
Devolver -1;
}
void crt_net(Net&ga)
{
ArcNode *p;
char nombre1[40],nombre2[40];
int i,j,k;
doble w; p> p>
printf("Ingrese el número de vértices y arcos:");
scanf("% d%d",&ga.vexnum,&ga.arcnum);
printf("Ingrese los nombres de los vértices en orden: \n");
for(i=0;i { p> scanf("%s",ga. vexs[i].szName); ga.vexs[i].firstarc=NULL; } p> for(k=0;k { printf("Ingrese los dos puntos fijos vecinos y los pesos:") scanf("%s%s%lf",nombre1,nombre2,&w); i=LocateVex(ga,nombre1); j=LocateVex( ga,nombre2); p=nuevo ArcNode; p->adjvex=j; p->adj=w; p->nextarc=ga.vexs[i].firstarc; ga.vexs[i].firstarc=p; } } void DFS(Net ga,char *nombre,int *visitado) { int v,w ArcNode * p; v=LocateVex(ga,nombre); visitó[v]=1; printf("%s " ,ga. p=ga.vexs[v].firstarc; while(p!=NULL) { w=p-> adjvex; if(visitado[w ]==0) DFS(ga,ga.vexs[w].szName,visitado); p =p->nextarc; } } void DFSTravel(Net ga,char *nombre) { int v,k=0; int visitado[20]; for(v=0;v visitó[v]=0; for(v=LocateVex(ga,name);k!=2;v =(v+1)%(ga. vexnum-1)) p> { if(v+1==LocateVex(ga,nombre))< /p> k++; if(visitado[v]==0) DFS(ga,ga.vexs[v].szName, visitado); p> p> } } void BFSTravel(Net ga,char *nombre) { ArcNode * p; int v,w,u,k=0; Cola Q; int visitado[20]; for( v=0;v visitó[v]=0; InitQueue(Q); for(v =LocateVex (ga,nombre);k! =2;v=(v +1)%(ga.vexnum-1)) { if(v+1= =LocateVex (ga,nombre)) k++; if(visitado[v]==0) { visitado [v ]=1; printf("%s ",ga.vexs[v].szName); EnterQueue(Q,v); while (EmptyQueue(Q)!= 0) { LeaveQueue(Q,u); p=ga.vexs[u].firstarc ; while(p!=NULL) { w=p->adjvex; if( visitado[w] == 0) { printf("%s ",ga.vexs[w].szName); visitó[w]=1; EnterQueue(Q,w); } p=p-> nextarc; } } } } } void main() { char name[40]; Net ga; crt_net(ga); printf ("Ingrese el nombre del punto de inicio del recorrido en profundidad primero: "); scanf("%s",nombre); printf("Primer recorrido en profundidad:"); DFSTravel(ga,nombre ); printf("\n"); printf("Ingrese el nombre del punto de inicio del recorrido en amplitud:"); scanf("%s ",nombre); printf("recorrido primero en anchura:"); BFSTravel(ga,nombre); printf("\n" ); }