/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Problema reservar memoria dinamica en matrimoniso estables

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
deryck



Registrado: 16 Mar 2007
Mensajes: 8

MensajePublicado: 26/10/2007 6:28 am
Título: Problema reservar memoria dinamica en matrimoniso estables

Hola a todos!
Mi problema es que tengo que utilizar memoria dinamica para resolver el problema de los matrimonios estables y la cosa es que la reservo pero algo debo hacer mal, porque no me da errores de compilación pero cuando lo ejecuto me da un segmentation default.
Aquí les dejo el código, a ver si alguien me puede ayudar.

Muchas gracias de antemano.

Código:
#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;

}


Ultima edición por deryck el 27/10/2007 5:19 am; editado 1 vez
Volver arriba
jonan_1988



Registrado: 12 Abr 2005
Mensajes: 48

MensajePublicado: 27/10/2007 3:53 am
Título:

Si te soy sincero, no me apetece nada leer tu código, no esta bien alineado y así no hay quien se entere así que no creo que nadie se moleste en leerlo, pero si te da una violación de segmento, busca un puntero no inicializado o algo así.

Sí quieres más ayuda pon bien el código para que sea más fácil Wink
_________________
Diario de un pre-informático
Volver arriba
deryck



Registrado: 16 Mar 2007
Mensajes: 8

MensajePublicado: 27/10/2007 5:15 am
Título:

Yo lo tengo bien alineado, lo que al ponerlo en el foro no se porque no reconoce las tabulaciones, lo voy a intentar poner de nuevo.
Volver arriba
deryck



Registrado: 16 Mar 2007
Mensajes: 8

MensajePublicado: 27/10/2007 5:20 am
Título:

Ya está, me equivoqué antes al ponerlo, ahora ya está alineado y le he quitado trozos del código para que no se vea tan grande.
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com