¡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; 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<<"->"< 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; p> 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> p> if(visitado[nosotros]==0) DFS(gra,nosotros); nosotros=nosotros1; } p> } 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< } //…………………………………………………………………………………… p> //…… …………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> 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; } p> //... Determinar si la cola está vacía... int queueempty(linkqueue q){ if(q.front==q.rear ) p> 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………… …… p> 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 ]; p> 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> 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; p> 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> p> if(!T) T=p; else q->nextsibling=p; p> q=p; DFSTree(gra,v,p); } } // ………… ………Recorrido de preorden del árbol de expansión en profundidad……………… void Preorder(CSTree T){ if(T){ cout< 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; 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"<