elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema al ordenar lista c++.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema al ordenar lista c++.  (Leído 3,737 veces)
Gaspi

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Problema al ordenar lista c++.
« 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


« Última modificación: 20 Febrero 2015, 22:38 pm por Gaspi » En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Problema al ordenar lista c++.
« Respuesta #1 en: 20 Febrero 2015, 21:14 pm »

para que codigo sean más legibles usa etiquetas GeSHi (mira mi firma)


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Gaspi

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Problema al ordenar lista c++.
« Respuesta #2 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
« Última modificación: 20 Febrero 2015, 21:54 pm por Gaspi » En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Problema al ordenar lista c++.
« Respuesta #3 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]
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: Problema al ordenar lista c++.
« Respuesta #4 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.
« Última modificación: 20 Febrero 2015, 22:56 pm por vangodp » En línea

Gaspi

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Problema al ordenar lista c++.
« Respuesta #5 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);

...
En línea

Gaspi

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Problema al ordenar lista c++.
« Respuesta #6 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
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
AYUDA C#!!! COMO ORDENAR UAN LISTA
.NET (C#, VB.NET, ASP)
neo_angel_xxx 2 10,182 Último mensaje 27 Octubre 2010, 19:43 pm
por [D4N93R]
AYUDA ORDENAR LISTA SIMPLE[C]
Programación C/C++
HRSLASH 0 9,113 Último mensaje 23 Abril 2011, 04:22 am
por HRSLASH
Problema al ordenar una Lista Doble(Lectura de XML)
Programación C/C++
falconez 1 1,948 Último mensaje 23 Febrero 2015, 03:25 am
por falconez
Ordenar una lista alfabeticamente
Programación C/C++
maferavagar 1 4,798 Último mensaje 17 Mayo 2015, 14:56 pm
por ivancea96
javascript - Ordenar por encabezados en forma de lista
Programación General
VicInFlames 0 1,670 Último mensaje 2 Noviembre 2015, 21:18 pm
por VicInFlames
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines