Red de conocimiento informático - Aprendizaje de código fuente - Creación de gráficos no dirigidos (matriz de adyacencia) y programa de recorrido en profundidad (C)

Creación de gráficos no dirigidos (matriz de adyacencia) y programa de recorrido en profundidad (C)

(1) Cree un gráfico utilizando una lista de adyacencia como estructura de almacenamiento.

(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)

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>

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

{

scanf("%s",ga. vexs[i].szName);

ga.vexs[i].firstarc=NULL;

}

for(k=0;k

{

printf("Ingrese los dos puntos fijos vecinos y los pesos:")

p>

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>

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))

{

if(v+1==LocateVex(ga,nombre))<

/p>

k++;

if(visitado[v]==0)

DFS(ga,ga.vexs[v].szName, visitado); 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;

p>

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" );

}