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.