Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Gaspi en 20 Febrero 2015, 21:13 pm



Título: Problema al ordenar lista c++.
Publicado por: Gaspi en 20 Febrero 2015, 21:13 pm
Hola, cómo va todo?
Estoy con un trabajo bastante largo, y tengo un pequeño problema al ordenar una lista.
La función ordenar la llamo desde lo siguiente

Código:
void GenerarFixture(Equipo vectorequipos[], tipofixture *&fixture, int &fechastotales, int &PartidosPorFecha, int &totalequipos, tipofixture *&puntero1, tipofixture *&punterofin,tipofixture *&punteroinicial) //Genera el fixture y además me devuelve algunos parámetros necesarios para saber tamaños
 {
     int i=0;
     int r=1;

     int local = 0;
     int visitante = 0;
    int y=0;
    int vec[99];
    int g=0;
LlenarVector(vectorequipos, i);


    if(i!=0){
    cout<<"Generando el fixture"<<endl;

    totalequipos = i+1;
    int t= totalequipos%2;

if (t==0){
        fechastotales=totalequipos-1;
}else fechastotales= totalequipos;

    PartidosPorFecha = totalequipos/2;

    crearlista(fixture);

    if(fechastotales!=0){

    int w=0;
    int l=1;
    while (l<=fechastotales){
        fixture=new(tipofixture);

        while(r<=totalequipos/2){

                    generarPartido(totalequipos, l, r, local, visitante);
                    ponerenlista(fixture,vectorequipos,local,visitante,i);
                    r++;
            };

        Aleatoriafecha(l,fechastotales,fixture,w,vec);
            if(puntero1==NULL && punteroinicial==NULL){ // Probablemente esta asignación esté mal hecha!
                puntero1=new(tipofixture);
                punteroinicial=new(tipofixture);
                puntero1=fixture;
                punteroinicial=fixture;
            };

        l++;

        fixture->infofixture.fuesimulado=false;

        if( l <= fechastotales){
        fixture=fixture->siguiente;
        }else punterofin=fixture->siguiente;




    };

    };

    cout<<"..."<<endl;
    cout<<"Generado!"<<endl;
    //                   <-----------------              acá llamaría a la función ordenarlista

  } else cout<<"En el archivo no hay equipos participantes!"<<endl; //si el archivo está vacío.

 }


Donde puntero1 y punteroinicial pretendo que sean punteros al primer nodo de la lista fixture.

Aquí las estructuras para la lista (sé que el typedef está de más):

Código:
typedef struct{
    char equipo[31];
    int resultado;
    int paramA;
    int paramB;
    int puntos;
}tipopartido;
typedef struct{ // local y visitante tienen almacenado un array tipopartido por fecha
    tipopartido local[99];
    tipopartido visitante[99];
    }partidosfixture;

typedef struct{ //nodo de información de la lista
    int fecha;
    partidosfixture tabla[99];
    bool fuesimulado;
}info;

typedef struct tipofixture{ // la lista del fixture
info infofixture;
tipofixture *siguiente;
 }tipofixture;


La función anterior funciona correctamente, pero cuando llamo a la función burbuja que creé para ordenar la lista, explota (no por error, sino porque hace comparaciones de NULL):

Código:
void OrdenarLista(int fechastotales, tipofixture *&puntero1){

    cout<<"Ordenando por fecha..."<<endl;
    tipofixture *auxiliar= NULL;
    if(auxiliar=NULL)
    {
      auxiliar=new(tipofixture);
    };
    
    auxiliar=puntero1;
    int aux=0;
    if(puntero1->siguiente==NULL){ //comprobé si era por esto que explotaba, y sí, justamente es nulo.
        cout<<"es nulo";
    }else cout<<" sigue"<<endl;

    while(puntero1!=NULL){
    for(int j=0;j<=(fechastotales-1);j++){
             auxiliar=auxiliar->siguiente;
            if(puntero1->infofixture.fecha>auxiliar->infofixture.fecha){
                aux=puntero1->infofixture.fecha;
                puntero1->infofixture.fecha=auxiliar->infofixture.fecha;
                auxiliar->infofixture.fecha=aux;
            }
        } puntero1=puntero1->siguiente;
    }


La idea es ordenar la lista por fecha en forma ascendente (ya que en aleatoriafecha estoy pasando numeros al azar desordenados), y que me quede ordenada por puntero1.
Fechastotales es el tamaño de la lista, puntero1, como dije, debería apuntar al primer nodo de la lista. La lista tiene más de un nodo, lo comprobé con salidas por pantalla, pero el error surge porque puntero1->siguiente es NULL, no entiendo porqué, quizá asigné mal el puntero.
Necesito ayuda urgente!
GRACIAS.



Uso CodeBlocks, y como dato aparte puntero1 y punteroinicial los inicié en el main como nulos. Tengo también un puntero para el final de la lista. La lista que uso en todo el programa se llama fixture.


EDITO: parece que tampoco me estaría rellenando la lista fixture, solo llena con la fecha en cada nodo, y no con los nombres (eso sólo lo hace en el primer nodo); alguna idea?
Esta es la función que uso:

Código:
void ponerenlista(tipofixture *&fixture, Equipo vectorequipos[], int &local, int &visitante, int i) //Para poner en lista tengo que revisar los índices.
{

    int a=0;


    buscarlocal(fixture,vectorequipos,local,visitante,i,a);
    buscarvisitante(fixture,vectorequipos,visitante,i,a);

}

void buscarlocal (tipofixture *&fixture, Equipo vectorequipos[], int local, int visitante, int i,int &a){ //Como el vector de equipos está ordenado por índice, hago una búsqueda binaria.

int inicio = 0;
int fin = i;
bool encontrado = false;
int pos = 0;
while (inicio<=fin && !encontrado){

    pos = (inicio+fin)/2;


    if(vectorequipos[pos].indice == local){


        encontrado=true;
        strncpy(fixture->infofixture.tabla[a].local[a].equipo, vectorequipos[pos].nombre,31);
        fixture->infofixture.tabla[a].local[a].paramA = vectorequipos[pos].paramA;
        fixture->infofixture.tabla[a].local[a].paramB = vectorequipos[pos].paramB;

        a++;
    } else if (vectorequipos[pos].indice>local){
            fin=pos-1;
            }else inicio = pos+1;

}
}
void buscarvisitante(tipofixture *&fixture, Equipo vectorequipos[], int visitante, int i, int &a){ //Búsqueda binaria para el visitante

int inicio = 0;
int fin = i;
bool encontrado = false;
int pos = 0;
while (inicio<=fin && !encontrado){
    pos = (inicio+fin)/2;
    if(vectorequipos[pos].indice == visitante){

        encontrado=true;
        strncpy(fixture->infofixture.tabla[a].visitante[a].equipo, vectorequipos[pos].nombre,31);
        fixture->infofixture.tabla[a].visitante[a].paramA = vectorequipos[pos].paramA;
        fixture->infofixture.tabla[a].visitante[a].paramB = vectorequipos[pos].paramB;
        cout<<fixture->infofixture.tabla[a].visitante[a].equipo<<endl;


        a++; // sumo acá el a porque ya terminé esta sección
    } else if (vectorequipos[pos].indice>visitante){
            fin=pos-1;
            }else inicio = pos+1;
}
}



De nuevo, nada tira error, todo compila, sigo pensando que es algo de la lista


Título: Re: Problema al ordenar lista c++.
Publicado por: engel lex en 20 Febrero 2015, 21:14 pm
para que codigo sean más legibles usa etiquetas GeSHi (mira mi firma)


Título: Re: Problema al ordenar lista c++.
Publicado por: Gaspi en 20 Febrero 2015, 21:42 pm
para que codigo sean más legibles usa etiquetas GeSHi (mira mi firma)

Está seleccionada esa opción :S, supongo que lo cambió usted  ;D gracias


Título: Re: Problema al ordenar lista c++.
Publicado por: engel lex en 20 Febrero 2015, 22:07 pm
selecciona el texto y luego escoges el lenguaje

la etiqeuta code de apertura quedará

Código:
[code=cpp]
[/code]


Título: Re: Problema al ordenar lista c++.
Publicado por: vangodp en 20 Febrero 2015, 22:41 pm
Reconstruyendo el post:
Aqui dejo el codigo completo: http://codepad.org/Cfv3Qp9G
dejo claro que es para ayudar al compañero Gaspi.  ;-)

Hola, cómo va todo?
Estoy con un trabajo bastante largo, y tengo un pequeño problema al ordenar una lista.
La función ordenar la llamo desde lo siguiente

Código
  1. void GenerarFixture(Equipo vectorequipos[], tipofixture *&fixture, int &fechastotales, int &PartidosPorFecha, int &totalequipos, tipofixture *&puntero1, tipofixture *&punterofin,tipofixture *&punteroinicial) //Genera el fixture y además me devuelve algunos parámetros necesarios para saber tamaños
  2. {
  3.     int i=0;
  4.     int r=1;
  5.  
  6.     int local = 0;
  7.     int visitante = 0;
  8.    int y=0;
  9.    int vec[99];
  10.    int g=0;
  11. LlenarVector(vectorequipos, i);
  12.  
  13.  
  14.    if(i!=0){
  15.    cout<<"Generando el fixture"<<endl;
  16.  
  17.    totalequipos = i+1;
  18.    int t= totalequipos%2;
  19.  
  20. if (t==0){
  21.        fechastotales=totalequipos-1;
  22. }else fechastotales= totalequipos;
  23.  
  24.    PartidosPorFecha = totalequipos/2;
  25.  
  26.    crearlista(fixture);
  27.  
  28.    if(fechastotales!=0){
  29.  
  30.    int w=0;
  31.    int l=1;
  32.    while (l<=fechastotales){
  33.        fixture=new(tipofixture);
  34.  
  35.        while(r<=totalequipos/2){
  36.  
  37.                    generarPartido(totalequipos, l, r, local, visitante);
  38.                    ponerenlista(fixture,vectorequipos,local,visitante,i);
  39.                    r++;
  40.            };
  41.  
  42.        Aleatoriafecha(l,fechastotales,fixture,w,vec);
  43.            if(puntero1==NULL && punteroinicial==NULL){ // Probablemente esta asignación esté mal hecha!
  44.                puntero1=new(tipofixture);
  45.                punteroinicial=new(tipofixture);
  46.                puntero1=fixture;
  47.                punteroinicial=fixture;
  48.            };
  49.  
  50.        l++;
  51.  
  52.        fixture->infofixture.fuesimulado=false;
  53.  
  54.        if( l <= fechastotales){
  55.        fixture=fixture->siguiente;
  56.        }else punterofin=fixture->siguiente;
  57.  
  58.  
  59.  
  60.  
  61.    };
  62.  
  63.    };
  64.  
  65.    cout<<"..."<<endl;
  66.    cout<<"Generado!"<<endl;
  67.    //                   <-----------------              acá llamaría a la función ordenarlista
  68.  
  69.  } else cout<<"En el archivo no hay equipos participantes!"<<endl; //si el archivo está vacío.
  70.  
  71. }
  72.  


Donde puntero1 y punteroinicial pretendo que sean punteros al primer nodo de la lista fixture.

Aquí las estructuras para la lista (sé que el typedef está de más):

Código
  1. typedef struct{
  2.    char equipo[31];
  3.    int resultado;
  4.    int paramA;
  5.    int paramB;
  6.    int puntos;
  7. }tipopartido;
  8. typedef struct{ // local y visitante tienen almacenado un array tipopartido por fecha
  9.    tipopartido local[99];
  10.    tipopartido visitante[99];
  11.    }partidosfixture;
  12.  
  13. typedef struct{ //nodo de información de la lista
  14.    int fecha;
  15.    partidosfixture tabla[99];
  16.    bool fuesimulado;
  17. }info;
  18.  
  19. typedef struct tipofixture{ // la lista del fixture
  20. info infofixture;
  21. tipofixture *siguiente;
  22. }tipofixture;
  23.  
  24.  

La función anterior funciona correctamente, pero cuando llamo a la función burbuja que creé para ordenar la lista, explota (no por error, sino porque hace comparaciones de NULL):

Código
  1. void OrdenarLista(int fechastotales, tipofixture *&puntero1){
  2.  
  3.    cout<<"Ordenando por fecha..."<<endl;
  4.    tipofixture *auxiliar= NULL;
  5.    if(auxiliar=NULL)
  6.    {
  7.      auxiliar=new(tipofixture);
  8.    };
  9.  
  10.    auxiliar=puntero1;
  11.    int aux=0;
  12.    if(puntero1->siguiente==NULL){ //comprobé si era por esto que explotaba, y sí, justamente es nulo.
  13.        cout<<"es nulo";
  14.    }else cout<<" sigue"<<endl;
  15.  
  16.    while(puntero1!=NULL){
  17.    for(int j=0;j<=(fechastotales-1);j++){
  18.             auxiliar=auxiliar->siguiente;
  19.            if(puntero1->infofixture.fecha>auxiliar->infofixture.fecha){
  20.                aux=puntero1->infofixture.fecha;
  21.                puntero1->infofixture.fecha=auxiliar->infofixture.fecha;
  22.                auxiliar->infofixture.fecha=aux;
  23.            }
  24.        } puntero1=puntero1->siguiente;
  25.    }
  26.  
  27.  
La idea es ordenar la lista por fecha en forma ascendente (ya que en aleatoriafecha estoy pasando numeros al azar desordenados), y que me quede ordenada por puntero1.
Fechastotales es el tamaño de la lista, puntero1, como dije, debería apuntar al primer nodo de la lista. La lista tiene más de un nodo, lo comprobé con salidas por pantalla, pero el error surge porque puntero1->siguiente es NULL, no entiendo porqué, quizá asigné mal el puntero.
Necesito ayuda urgente!
GRACIAS.



Uso CodeBlocks, y como dato aparte puntero1 y punteroinicial los inicié en el main como nulos. Tengo también un puntero para el final de la lista. La lista que uso en todo el programa se llama fixture.


EDITO: parece que tampoco me estaría rellenando la lista fixture, solo llena con la fecha en cada nodo, y no con los nombres (eso sólo lo hace en el primer nodo); alguna idea?
Esta es la función que uso:

Código:

Código
  1. void ponerenlista(tipofixture *&fixture, Equipo vectorequipos[], int &local, int &visitante, int i) //Para poner en lista tengo que revisar los índices.
  2. {
  3.  
  4.    int a=0;
  5.  
  6.  
  7.    buscarlocal(fixture,vectorequipos,local,visitante,i,a);
  8.    buscarvisitante(fixture,vectorequipos,visitante,i,a);
  9.  
  10. }
  11.  
  12. void buscarlocal (tipofixture *&fixture, Equipo vectorequipos[], int local, int visitante, int i,int &a){ //Como el vector de equipos está ordenado por índice, hago una búsqueda binaria.
  13.  
  14. int inicio = 0;
  15. int fin = i;
  16. bool encontrado = false;
  17. int pos = 0;
  18. while (inicio<=fin && !encontrado){
  19.  
  20.    pos = (inicio+fin)/2;
  21.  
  22.  
  23.    if(vectorequipos[pos].indice == local){
  24.  
  25.  
  26.        encontrado=true;
  27.        strncpy(fixture->infofixture.tabla[a].local[a].equipo, vectorequipos[pos].nombre,31);
  28.        fixture->infofixture.tabla[a].local[a].paramA = vectorequipos[pos].paramA;
  29.        fixture->infofixture.tabla[a].local[a].paramB = vectorequipos[pos].paramB;
  30.  
  31.        a++;
  32.    } else if (vectorequipos[pos].indice>local){
  33.            fin=pos-1;
  34.            }else inicio = pos+1;
  35.  
  36. }
  37. }
  38. void buscarvisitante(tipofixture *&fixture, Equipo vectorequipos[], int visitante, int i, int &a){ //Búsqueda binaria para el visitante
  39.  
  40. int inicio = 0;
  41. int fin = i;
  42. bool encontrado = false;
  43. int pos = 0;
  44. while (inicio<=fin && !encontrado){
  45.    pos = (inicio+fin)/2;
  46.    if(vectorequipos[pos].indice == visitante){
  47.  
  48.        encontrado=true;
  49.        strncpy(fixture->infofixture.tabla[a].visitante[a].equipo, vectorequipos[pos].nombre,31);
  50.        fixture->infofixture.tabla[a].visitante[a].paramA = vectorequipos[pos].paramA;
  51.        fixture->infofixture.tabla[a].visitante[a].paramB = vectorequipos[pos].paramB;
  52.        cout<<fixture->infofixture.tabla[a].visitante[a].equipo<<endl;
  53.  
  54.  
  55.        a++; // sumo acá el a porque ya terminé esta sección
  56.    } else if (vectorequipos[pos].indice>visitante){
  57.            fin=pos-1;
  58.            }else inicio = pos+1;
  59. }
  60. }
  61.  

De nuevo, nada tira error, todo compila, sigo pensando que es algo de la lista

Edit por vangodp:
aqui pongo el archivo de equipos

equipos.txt
Código:
1        1157    315    River Plate
2 736     412    Lanús
3 947     842    Independiente
4 631     526    At. de Rafaela
5 631     578    N.O. Boys
6 736     578    Estudiantes L.P.
7 789     789    Racing Club
8 578     526    Vélez Sarsfield
9 526     631    Boca Juniors
10 684     421    Tigre
11 473     473    Gimnasia y Esgrima L.P.
12 736     842    Rosario Central
13 631     736    San Lorenzo de Almagro
14 578     736    Arsenal F.C.
15 578     631    Banfield
16 736    1000    Defensa y Justicia
17 578     789    Belgrano
18 526     842    Godoy Cruz (Mza.)
19 315     578    Olimpo (B. Blanca)
20 631     947    Quilmes A.C.


Título: Re: Problema al ordenar lista c++.
Publicado por: Gaspi en 20 Febrero 2015, 22:51 pm
selecciona el texto y luego escoges el lenguaje

la etiqeuta code de apertura quedará

Código:
[code=cpp]
[/code]

Sale todo raro si pongo eso, me cambia el código y se ve todo verde:
 
void GenerarFixture(Equipo vectorequipos[], tipofixture *&fixture, int &fechastotales, int &PartidosPorFecha, int &totalequipos, tipofixture *&puntero1, tipofixture *&punterofin,tipofixture *&punteroinicial) //Genera el fixture y adem&#225;s me devuelve algunos par&#225;metros necesarios para saber tama&#241;os
 {
 &#160; &#160; int i=0;
 &#160; &#160; int r=1;
 
 &#160; &#160; int local = 0;
 &#160; &#160; int visitante = 0;
 &#160; &#160;int y=0;
 &#160; &#160;int vec[99];
 &#160; &#160;int g=0;
   LlenarVector(vectorequipos, i);

...


Título: Re: Problema al ordenar lista c++.
Publicado por: Gaspi en 20 Febrero 2015, 22:53 pm
Reconstruyendo el post:
Aqui dejo el codigo completo: http://codepad.org/Cfv3Qp9G
dejo claro que es para ayudar al compañero Gaspi.  ;-)



Jajaja, gracias por eso, me ahorraste trabajo