Red de conocimiento informático - Conocimiento del nombre de dominio - ¡Urgente! ! ! ! ! Diseño del curso de estructura de datos.

¡Urgente! ! ! ! ! Diseño del curso de estructura de datos.

#include

#include

#include

# define MAX_VERTEX_NUM 30 //Número máximo de vértices

#define INFINITY 10000000 //Infinito

typedef struct ArcCell{

int adj;

}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

estructura typedef{

char vexs[MAX_VERTEX_NUM];

Arcos AdjMatrix;

int vexnum,arcnum;

}MGraph;

//Consulta la posición del vértice

int LocateVex(MGraph G,char v){

int i=0;

while(G.vexs[i]!=v&&i

i++;

return i ;

}

//Crear la matriz de adyacencia del gráfico

MGraph CreateMGraph(){

MGraph G;

int i,j,k;

int w;

char v1,v2;

cout<<"Por favor, introduzca el número de vértices del gráfico:";

cin>>G.vexnum;

cout<<"Por favor, introduzca el número de arcos del gráfico:";

cin>>G.arcnum;

for(i=0;i

cout<<"Por favor, introduzca "<

cin>>G.vexs[i];

}

for(i=0;i

for(j=0;j

G.arcs[i][j].adj=INFINITY;

for(k=0;k< G.arcnum;k++){

cout<<"Por favor ingrese el arco"<

cin>> v1>>v2>>w;

if(LocateVex(G,v1)

i=LocateVex(G,v1 );

else{

cout<<"¡Este vértice no fue encontrado! "<

k--;

continuar;

}

if(LocateVex(G,v2)

j=LocateVex(G,v2);

else{

cout<<"¡Este vértice no fue encontrado! "<

k

--;

continuar;

}

G.arcs[i][j].adj=w;

G. arcs[j][i]=G.arcs[i][j];

}

cout<<"¡MGrafo creado exitosamente!"<

return G;

}

//……………………Salida MGraph………………

void PrintMGraph( MGraph G ){

cout<<"Matriz de adyacencia del gráfico"<

int i,j;

for(i=0;i

cout<<" "<

cout<

for( i =0 ;i

cout<

for( j=0;j

if(G.arcs[i][j].adj!=INFINITY)

cout<

else

cout<<"∞"<<" ";

}

cout<

}

cout<<"-------------------------------- ---------------"<

}

//……………………Encuentra el grado de cada vértice… ………………

void Vdu(MGraph G){ //Encuentra el grado de cada vértice

int i,j;

int V[20 ];

for(i=0;i

int count=0;

for(j= 0;j

if(G.arcs[i][j].adj!=INFINITY)

count++;

V[i ]=count;

}

for(i=0;i

cout<

}

//……………………Insertar vértice………………

void InsertVex(MGraph &G){

char v;

int i,j;

cout<<"Por favor ingrese el vértice que desea insertar:";

cin>>v;

i =G vexnum++;

G.vexs[i]=v;

for(j=0;j

G .arcos[i][j

].adj=INFINITY;

j=G.vexnum-1;

for(i=0;i

G .arcs[i][j].adj=INFINITY;

cout<

}

//……………………Insertar arco………………

void InsertArc(MGraph &G){

char v1,v2;

int i,j,w;

cout<<"Por favor ingrese los vértices y pesos asociados con el arco que desea insertar:";

cin>>v1>> v2 >>w;

if(LocateVex(G,v1)

i=LocateVex(G,v1) ;

j=LocateVex(G,v2);

G.arcs[i][j].adj=w;

G.arcs[j ] [i]=G.arcs[i][j];

cout<

}else{

cout<<"¡No se encontró ningún vértice asociado!"<

}

}

//……………… …Eliminar vértices………………

void DeleteVex(MGraph &G){

int i,j;

char v;

cout <<"Ingrese los vértices que desea eliminar:";

cin>>v;

if(LocateVex(G,v)

int l=LocateVex(G,v);

for(i=l;i

G. vexs[i] =G.vexs[i+1];

for(i=l;i

for(j=0; j

G.arcs[i][j]=G.arcs[i+1][j];

for(i=0; i

for(j=l;j

G.arcs[i][j]=G arcs[i] [j+1];

G.vexnum--;

cout<<"¡Este vértice se ha eliminado correctamente! "<

}else

cout<<"¡No existe tal vértice! "<

}

//……………………Eliminar arco…………

void DeleteArc(MGraph &G) {

int i,j;

char v1,v2;

cout<<"Ingrese el vértice asociado con el arco que desea eliminar" ;

cin>&g

t;v1>>v2;

if(LocateVex(G,v1)

i=LocateVex(G, v1);

j=LocateVex(G,v2);

G.arcs[i][j].adj=INFINITY;

G.arcs [j][i]=G.arcs[i][j];

cout<<"¡Este arco se ha eliminado correctamente!"<

}else< / p>

cout<<"¡No se encontró el vértice asociado con este arco!"<

}

typedef struct ArcNode{

int adjvex;

estructura ArcNode *nextarc;

}ArcNode;

typedef estructura vnode{

datos char;

ArcNode *firstarc;

}vnode,adjlist;

typedef struct {

adjlist vértices[MAX_VERTEX_NUM];

int vexnum ,arcnum;

}ALGraph;

//……………………Crear una lista de adyacencia del gráfico………………

ALGraph CreateUDG(MGraph G){

ALGraph gra;

int i,j;

ArcNode *arc,*tem,*p;

for(i=0;i

gra.vertices[i].data=G.vexs[i];

gra.vertices [i].firstarc=NULL;

}

for(i=0;i

for( j=0 ;j

if(gra.vertices[i].firstarc==NULL){

if(G.arcs[i] [j] .adj!=INFINITY){

arc=(ArcNode*)malloc(sizeof(ArcNode));

arc->adjvex=j;

gra .vertices[i].firstarc=arc;

arc->nextarc=NULL;

p=arc;

j++;

while(G.arcs[i][j].adj!=INFINITY&&j

tem=(ArcNode*)malloc(sizeof(ArcNode));

tem->adjvex=j;

gra.vertices[i].firstarc=tem;

tem->nextarc=arc;

arco=tem ;

j++;

}

}

}else{

if(G.arcs[i][j].adj!= INFINITO){

arc=(ArcNode*)malloc(sizeof(ArcNode));

arc->adjvex=j;

p->nextarc= arco;

arc->nextarc=NULL;

p=arc;

}

}

}

}

gra.vexnum=G.vexnum;

gra.arcnum=G.arcnum;

cout<<" ALGraph se creó correctamente "<

return gra;

}

//……………………Salida ALGraph………… ………

void PrintUDG(ALGraph gra){

int i;

ArcNode *p;

cout<<"Graph Cada vértice de es: "<

for(i=0;i

cout<

cout<

cout<<"La lista de adyacencia del gráfico es: "<

for(i =0 ;i

cout<

p=gra.vertices [i ].firstarc;

while(p){

cout<<"->"<adjvex;

p=p- >nextarc ;

}

cout<

}

}

//.. Definir variable global...

int visitado[MAX_VERTEX_NUM];

int nosotros;

//...encontrar el primer punto adyacente...

int firstadjvex(ALGraph gra,vnode v){

if(v.firstarc!=NULL)

return v.firstarc->adjvex;

else

return -1;

}

//... Encuentra el siguiente punto adyacente relativo a w

int nextadjvex( ALGraph gra,vnode v,int w){

ArcNode *p;

p=v.firstarc;

while(p! =NULL&&p->adjvex !=w){

p=p->nextarc;

}

if(p->adjvex==w&&p-> nextarc!=NULL) {

> p=p->nextarc;

devolver p->adjvex;

}else

devolver -1;

}

//…………………… Recorrido en profundidad del gráfico………………

void DFS(ALGraph gra,int i){

visitado[i]=1;

int we1;

cout<

para (nosotros=firstadjvex(gra,gra.vertices[i]);nosotros>=0;nosotros=nextadjvex(gra,gra.vertices[i],nosotros)){

nosotros1=nosotros; p>

if(visitado[nosotros]==0)

DFS(gra,nosotros);

nosotros=nosotros1;

}

}

void DFSTravers(ALGraph gra){

int i;

for(i=0;i

visitó[i]=0;

}

para(i=0;i

if(visitado[i]==0)

DFS(gra,i);

}

cout<

}

//……………………………………………………………………………………

//…… …………Definición de cola y operaciones básicas……………………

typedef struct qnode{

int data;

estructura qnode * siguiente;

}qnode,*queueptr;

estructura typedef{

queueptr front;

queueptr rear;

}linkqueue;

//...Inicializa la cola...

void initqueue(linkqueue &q){

q.rear=(queueptr)malloc (sizeof(qnode));

q.front=q.rear;

q.front->next=NULL;

}

//...En cola...

int enqueue(linkqueue &q,int e){

queueptr p;

p=(queueptr )malloc(sizeof(qnode)); //El sistema genera el nodo qnode y lo asigna a p

if(!p)

devolver 0;

else{

p->data=e;

p->next=NULL;

q.rear ->siguiente=p;

q.rear=p;

devolver 1;

}

}

//...quitar de cola...

int quitar de cola(cola de enlace &q,int &e){

queueptr p;

if(q.front==q.rear)

devuelve 0;

p=q.front ->siguiente;

e=p->datos;

q.front->siguiente=p->siguiente;

if(q.rear= =p)

q.rear=q.front;

gratis(p);

devuelve 1;

}

//... Determinar si la cola está vacía...

int queueempty(linkqueue q){

if(q.front==q.rear )

devuelve 1;

devuelve 0;

}

//……………………………… …… ……………………………………

//…………Recorrido en amplitud del gráfico………………

void BFSTravers (ALGraph gra){

int i,e;

linkqueue q;

for(i=0;i

visitado[i]=0;

initqueue(q); //La cola adjunta almacena los vértices con una longitud de ruta de 1 2... que han sido visitados

for(i=0;i

if(!visited[i]){

visitó[i]=1;

cout<

enqueue(q,i);

while(!queueempty(q)){

dequeue(q,e);

for(we=firstadjvex(gra,gra.vertices[e]);we>=0;we=nextadjvex(gra,gra. vértices[e] ],nosotros)){

if(!visitamos[nosotros]){

visitamos[nosotros]=1;

cout<< gra.vertices[ nosotros].data<<" ";

enqueue(q,nosotros);

}

}

}

}

cout<

}

//……………………Encuentra las ramas conectadas del gráfico…… …………

void DFSTraversFL(ALGraph gra){

int i,count=1;

for(i=0; i

visitó[i]=0;

}

for(i=0;i

if(visited[i]==0){

cout<<"La rama conectada "<

DFS (gra,i);

// Para un gráfico conectado, solo necesita comenzar desde un vértice y realizar un recorrido en profundidad para acceder a todos los vértices

cout<

count++;

}

}

}

//……………………Utilice el algoritmo de Prim para encontrar el árbol de expansión mínimo………… ……

void PRIM(ALGraph gra,int g[][MAX_VERTEX_NUM],int n){

int lowcost[MAX_VERTEX_NUM],prevex[MAX_VERTEX_NUM];

int i ,j,k,min;

for(i=2;i<=n;i++){

bajo costo[i]=g[1][i ];

prevex[i]=1;

}

lowcost[1]=0;

for(i=2 ;i<= n;i++){

min=INFINITY;

k=0;

for(j=2;j<=n;j++ )

if(bajo costo[j]

min=bajo costo[j];

k=j;

}

cout<

bajo costo[k]=0;

for(j=2;j<=n;j++)

if(g[k ][j]

lowcost[j]=g[k][j];

prevex[j]=k;

}

cout<

}

}

//…………Encuentra el camino más corto…… ……

void ShortPath(MGraph G,char ch){ //Implementación del algoritmo de Dijkstra, de un punto determinado a otros puntos

int i,j,min,k,t ,w;

int v=0;

int final[MAX_VERTEX_NUM];

int bajo costo[MAX_VERTEX_NUM];

int q [MAX_VERTEX_NUM] [MAX_VERTEX_NUM];

k=LocateVex(G,ch);

for(i=0;i

final [i]=0;

lowcost[i]=G.arcs[k][i].adj;

for(j=0;j

q[i][j]=0;

if(lowcost[i]

q[i][ k]= 1;

q[i][i]=1;

}

}

bajo costo[k]= 0;

final[k]=1;

for(i=0;i

i++){

min=INFINITY;

for(j=0;j

if(!final[j])

if(bajo costo[j]

min=bajo costo[j];

v=j;

}

final[v]=1;

for(w=0;w

if(!final[w]&& (min+G.arcs[v][w].adj

lowcost[w]=min+G.arcs[v][w].adj; p>

for(t=0;t

q[w][t]=q[v][t];

q [w][w]=1;

}

}

for(i=0;i

if(i!=k){

cout<

cout << "Ruta más corta:";

if(lowcost[i]

for(j=0;j

if(q[i][j]&&j!=i)

cout<

cout<

cout<<"Longitud: "<

}else

cout<<"¿Tiene no existe "<

}

}

}

typedef estructura CSNode{

datos de caracteres;

estructura CSNode *firstchild,*nextsibling;

}CSNode,*CSTree;

//……………………Profundidad- primer árbol de expansión… ………………

void DFSTree(ALGraph gra,int v,CSTree &T){ //Salida secuencial después de la búsqueda en profundidad

visitado[v] =1;

int w,first=1;

CSTree p,q;

for(w=firstadjvex(gra,gra.vertices[v] );w>= 0;w=nextadjvex(gra,gra.vertices[v],w))

if(!visited[w]){

p=(CSTree )malloc(sizeof( CSNode));

p->data=gra.vertices[w].data;

p->firstchild=NULL;

p->ne

xtsibling=NULL;

if(first){

T->firstchild=p;

first=0;

}else

q->nextsibling=p;

q=p;

DFSTree(gra,w,q);

}

}

void DFSForest(ALGraph gra,CSTree &T){

T=NULL;

CSTree p,q;

int v;

for(v=0;v

visitó[v]=0;

for (v=0;v

if(!visited[v]){

p=(CSTree)malloc(sizeof(CSNode));

p->data=gra.vertices[v].data;

p->firstchild=NULL;

p->nextsibling=NULL;

p>

if(!T)

T=p;

else

q->nextsibling=p;

q=p;

DFSTree(gra,v,p);

}

}

// ………… ………Recorrido de preorden del árbol de expansión en profundidad………………

void Preorder(CSTree T){

if(T){

cout<data<<" ";

Reserva (T->primer hijo);

Reserva (T->siguiente hermano);

}

cout<

}

//……………………Encuentra el camino más corto entre u y v… ……… ………

void shortdistance(MGraph G){

int i,u,v,w,S,E;

char start, end;

int Distancia[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

cout<<"Por favor, introduzca dos vértices:";

cin>>start>>end ;

while(LocateVex(G,start)>=G.vexnum||LocateVex(G,end)>=G.vexnum){

cout<<"Sin vértice asociado encontró ! Vuelva a ingresar: ";

cin>>start>>end;

}

for(i=0;i

G.arcs[i][i].adj=0;

for(u=0;u

para (v=0;v

/p>

Distancia[u][v]=G.arcs[u][v].adj;

for(u=0;u

for(v=0;v

for(w=0;w

if(Distancia[ u][w]+Distancia[w][v]

Distancia[u][v]=Distancia[u][w]+Distancia[w][ v];

S=LocateVex(G,inicio);

E=LocateVex(G,fin);

if(Distancia[S][E ]==INFINITY)

cout<

else

El camino más corto desde cout<

}

//……………………Encontrar el camino más corto entre todos los vértices………………

void shortdistance(MGraph G){ //Implementación del algoritmo de Freud, dos vértices cualesquiera

int i,j,u,v,w;

int D[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

for(i=0; i

G.arcs[i][i].adj=0;

for(u=0;u

for(v=0;v

D[u][v]=G.arcs[u][v].adj;

p >

for(u=0;u

for(v=0;v

for(w = 0;w

if(D[u][w]+D[w][v]

D[u][v]=D[u][w]+D[w][v];

for(i=0;i

for(j=0;j

if(D[i][j]==INFINITY)

cout<

else

cout<

}

void main(){

int i,j;

char ch='y';

MGraph G;

> G.vexnum=0;

ALGraph gra;

gra.vexnum=0;

int t[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

CSTree T=NULL;

while(ch=='y'){

cout<<"************** ***********************************************"<

cout<<" MENU"<

cout<<"*********************; *** ****************************************"<

cout<<" "<<"1 |Crear un gráfico usando una matriz de adyacencia"<

cout<<" "<<"2 |Mostrar la matriz de adyacencia de un gráfico "<

cout<<" "<<"3 | Encuentra el grado de cada vértice"<

cout<<" "<<"4 | Insertar vértices"<

cout<<" "<<"5 |Insertar arco"<

cout<<" "<<"6 |Eliminar vértice "<

cout<<" "<<"7 |Eliminar arcos"<

cout<<" "<<"8 |Crear lista de adyacencia UDG con matriz de adyacencia"<

cout<<" "<<"9 |Mostrar la lista de adyacencia del gráfico"<

cout<<" "< <"10 |Secuencia de conveniencia primero en profundidad"<

cout<<" "<<"11 |Secuencia de conveniencia primero en profundidad"<

cout< <" "<<"12 |Ramas conectadas de gráficos "<

cout<<" "<<"13 | Encuentra el árbol de expansión mínimo de un gráfico conectado"<

cout<<" "<<"14 | Encuentra el camino más corto desde cualquier vértice a otros vértices"<

cout<<" "<<"15 | Encuentra la profundidad -primer árbol de expansión del gráfico"<

cout<<" "<<"16 | Realizar un recorrido de preorden del árbol de expansión"<

cout<<" "<<"17 | Encuentra el camino más corto entre dos puntos"<

cout<<" "<<"18 |Encuentra el camino más corto entre todos los puntos"<< endl;

cout<<" "<<"0 |¡Salir! "<

cout<<"*************************************** *** *************************"<

cout<

cin>>i;

switch(i){

caso 1:

if( G.vexnum==0)

G=CreateMGraph();

else

cout<<"¡MGraph ha sido creado!"<

ruptura;

caso 2:

if(G.vexnum!=0)

PrintMGraph(G);

else

cout<<"¡MGraph está vacío!"<

break;

caso 3:

if(G.vexnum==0)

cout<<"¡Por favor, cree MGraph primero!"<

else

Vdu(G);

break;

caso 4:

if(G.vexnum==0)

cout<<"Crea primero MGraph !"<

else

InsertVex(G);

break;

caso 5:

if(G.vexnum== 0)

cout<<"¡Por favor, cree MGraph primero!"<

else

InsertArc(G );

break;

caso 6:

if(G.vexnum==0)

cout<<"Por favor cree ¡MGraph primero!"<

else

DeleteVex(G);

break;

caso 7:

if(G.vexnum ==0)

cout<<"¡Crea MGraph primero! "<

else

DeleteArc(G);

break;

caso 8:

if(G.vexnum==0)

cout<<"¡Primero cree MGraph! "<

else{

gra=CreateUDG(G);

}

descanso;

caso 9:

if(gra.vexnum!=0)

PrintUDG(gra);

else

cou

t<<"UDG está vacío!"<

descanso;

caso 10:

if(gra.vexnum!=0){

cout<<"La secuencia transversal en profundidad del gráfico es:";

DFSTravers(gra);

}

else

else

p>

cout<<"¡Primero cree ALGraph!"<

break;

caso 11:

if(gra.vexnum !=0){

cout<<"La secuencia transversal del gráfico en anchura es:";

BFSTravers(gra);

}

else

cout<<"¡Primero cree ALGraph!"<

break;

caso 12:

if(gra.vexnum!=0){

cout<<"Las ramas conectadas del gráfico son las siguientes :"<

DFSTraversFL(gra);

}

else

cout<<"¡Primero cree ALGraph! "<

descanso;

caso 13:

if(gra.vexnum!=0){

for( i=0;i

for(j= 0;j

t[i+1][j+1 ]=G.arcs[i][j].adj;

cout< <"El árbol de expansión mínimo del gráfico es:"<

PRIM(gra, t,G.vexnum);

}

else

cout<<"¡Primero cree ALGraph!"<

break;

caso 14:

if(G.vexnum ==0)

cout<<"¡Por favor, cree MGraph primero! "<

else{

char ch;

cout<<"Por favor seleccione un vértice:";

cin >>ch;

while(LocateVex(G,ch)>=G.vexnum){

cout<<"¡Este vértice no fue encontrado! Vuelva a seleccionar un vértice: ";

cin>>ch;

}

ShortPath(G,ch);

}

break;

caso 15:

if(gra.vexnum==0)

cout<<"¡Crea ALGraph primero! "<&l

t;endl;

else

DFSForest(gra,T);

break;

caso 16:

if(!T)

cout<<"¡Solicite primero el árbol de expansión en profundidad!"<

else{

Reserva (T );

cout<<"¡El árbol de expansión en profundidad se ha creado correctamente!"<

}

break;

caso 17:

if(G.vexnum==0)

cout<<"¡Primero cree MGraph!"<

else

distancia más corta(G);

descanso;

caso 18:

if(G.vexnum==0)

cout<<"¡Primero cree MGraph!"<

else

shortdistance(G);

break;

caso 0:

salida(1);

predeterminado:

cout<<"¡Por favor, elija entre 0~18!"< < endl;

}

cout<<"Continuar y/n:";

cin>>ch;

system( "cls");

}

}