#include <stdio.h>
#include <stdlib.h>
//Numero de hombres y mujeres que quieres unir
#define NumParejas 4
//Variables globales
int **TablaEmparejamiento;
int EmparejamientoTotal=0; int *mujerPreferencia; int *hombrePreferencia;
// Nombre de hombres y mujeres que quieres unir
char *Mnombres[50] = {
"M1",
"M2",
"M3",
"M4"
};
char *Hnombres[50] = {
"H1",
"H2",
"H3",
"H4"
};
struct mujer {
int libre; int *mujerPreferencia;
};
struct hombre {
int libre;
int *hombrePreferencia;
int proponerMat;
};
// Funciones void reservarMemoria(struct mujer *preferenciaM,struct hombre *preferenciaH){ int i; //Reservamos memoria para la tabla de emparejamiento if((TablaEmparejamiento=(int **)malloc(sizeof(int)*NumParejas))==NULL){ printf("\nERROR en la asignacion de memoria."); exit(1); }else{ for(i=0;i<NumParejas;i++){ if((TablaEmparejamiento[i]=(int *)malloc(NumParejas*sizeof(int)))==NULL){ printf("\nERROR en la asignacion de memoria."); exit(1); } } } //Reservamos memoria para la preferencias de hombres y mujeres if((preferenciaM->mujerPreferencia=(int *)malloc(sizeof(int)*(NumParejas)))==NULL){ printf("\nERROR en la asignacion de memoria."); exit(1); } if((preferenciaH->hombrePreferencia=(int *)malloc(sizeof(int)*(NumParejas)))==NULL){ printf("\nERROR en la asignacion de memoria."); exit(1); }
}
void valorInicial(struct mujer *preferenciaM,struct hombre *preferenciaH) {
int i;
for(i=0; i<NumParejas; i++) {
preferenciaH[i].libre = -1; //Inicialmente todos los hombres son libres de proponer a cualquier mujer
preferenciaH[i].proponerMat = 0; //Nos da la siguiente mujer libre que puede ser propuesta
preferenciaM[i].libre = -1;
}
}
void asignarHMPreferencias(struct mujer *preferenciaM,struct hombre *preferenciaH) {
int i, j,preferencia;
printf("\nPor favor introduzca las preferencias de los hombres: "); for(i=0;i<NumParejas;i++){ printf("\nHombre %d :\n", i); for(j=0;j<NumParejas;j++){ printf("\t %dª Preferencia ---------> ", j+1); scanf("%d",&preferencia); getchar(); preferenciaH[i].hombrePreferencia[j] = preferencia; //printf("\t\t%d",preferencia); } } printf("\nPor favor introduzca las preferencias de las mujeres: "); for(i=0;i<NumParejas;i++){ printf("\nMujer %d:\n", i); for(j=0;j<NumParejas;j++){ printf("\t %dª Preferencia ---------> ", j+1); scanf("%d",&preferencia); preferenciaM[i].mujerPreferencia[j] = preferencia; } }
}
void mostrarHMPreferencias(struct mujer *preferenciaM,struct hombre *preferenciaH) {
int i,j;
//Preferencias del hombre
printf ("\n\n\t\tPreferencias del hombre\t\t");
printf ("\n\n----------------------------------------------------");
for (i=0; i<NumParejas; i++) {
printf ("\n%-10s : ",Hnombres[i]);
for (j=0; j<NumParejas; j++) {
printf ("%-10s",Mnombres[preferenciaH[i].hombrePreferencia[j]]);
}
}
printf ("\n-----------------------------------------------------\n\n");
//Preferencias de la mujer
printf ("\n\n\t\tPreferencias de la mujer\t\t");
printf ("\n\n----------------------------------------------------");
for (i=0; i<NumParejas; i++) {
printf ("\n%-10s : ",Mnombres[i]);
for (j=0; j<NumParejas; j++) {
printf ("%-10s",Hnombres[preferenciaM[i].mujerPreferencia[j]]);
}
}
printf ("\n-----------------------------------------------------\n\n");
}
void algoritmoEmparejar(struct mujer *preferenciaM,struct hombre *preferenciaH) { ... }
void printTablaEmparejamiento() { ... }
int main(void) {
int i;
printf ("\n\nEL PROBLEMA DE LOS MATRIMONIOS ESTABLES\n\n"); struct mujer *preferenciaM; struct hombre *preferenciaH; preferenciaM=(struct mujer *)malloc(sizeof(struct mujer)); preferenciaH=(struct hombre *)malloc(sizeof(struct hombre)); if((preferenciaM == NULL)||(preferenciaH == NULL)){ printf("\nERROR. Fallo en la reserva de memoria para preferenciaM/preferenciaH"); exit(-1); } reservarMemoria(preferenciaM,preferenciaH);
valorInicial(preferenciaM,preferenciaH);
asignarHMPreferencias(preferenciaM,preferenciaH); //Asignamos preferencias
mostrarHMPreferencias(preferenciaM,preferenciaH); printf("\nEntramos en el algoritmo"); getchar();
algoritmoEmparejar(preferenciaM,preferenciaH); printf("\nAlgoritmo pasado");
printTablaEmparejamiento(); free(preferenciaM); free(preferenciaH);
return 0;
}
|