Autor
|
Tema: Problema al ordenar lista c++. (Leído 3,755 veces)
|
Gaspi
Desconectado
Mensajes: 10
|
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 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): 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): 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: 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
|
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
Mensajes: 10
|
para que codigo sean más legibles usa etiquetas GeSHi (mira mi firma)
Está seleccionada esa opción :S, supongo que lo cambió usted gracias
|
|
« Última modificación: 20 Febrero 2015, 21:54 pm por Gaspi »
|
En línea
|
|
|
|
engel lex
|
selecciona el texto y luego escoges el lenguaje la etiqeuta code de apertura quedará [/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
Mensajes: 455
|
Reconstruyendo el post: Aqui dejo el codigo completo: http://codepad.org/Cfv3Qp9Gdejo 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 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): 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): 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 Edit por vangodp: aqui pongo el archivo de equipos equipos.txt 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
Mensajes: 10
|
selecciona el texto y luego escoges el lenguaje la etiqeuta code de apertura quedará [/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á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); ...
|
|
|
En línea
|
|
|
|
Gaspi
Desconectado
Mensajes: 10
|
Jajaja, gracias por eso, me ahorraste trabajo
|
|
|
En línea
|
|
|
|
|
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,206
|
27 Octubre 2010, 19:43 pm
por [D4N93R]
|
|
|
AYUDA ORDENAR LISTA SIMPLE[C]
Programación C/C++
|
HRSLASH
|
0
|
9,125
|
23 Abril 2011, 04:22 am
por HRSLASH
|
|
|
Problema al ordenar una Lista Doble(Lectura de XML)
Programación C/C++
|
falconez
|
1
|
1,958
|
23 Febrero 2015, 03:25 am
por falconez
|
|
|
Ordenar una lista alfabeticamente
Programación C/C++
|
maferavagar
|
1
|
4,814
|
17 Mayo 2015, 14:56 pm
por ivancea96
|
|
|
javascript - Ordenar por encabezados en forma de lista
Programación General
|
VicInFlames
|
0
|
1,679
|
2 Noviembre 2015, 21:18 pm
por VicInFlames
|
|