Bueno pues llevo dos dias liado dandole vueltas y todo lo que he intentado o me rompia la lista o la convertia en un bucle infinito cerrandola sobre si misma. Al final he optado por hacerlo sin punteros y simplemente copiar los elementos de un lugar a otro que asi no falla pero una vez lo hice con punteros que era mas rapido y recuerdo que tenia que jugar con los punteros que apuntaban al siguiente elemento tanto de los que intercambio como de sus predecesores pero no veo la manera y me tiene ya loco. Ahora mismo lo tengo asi y tiene que ser en C:
Código C:
Ver originalvoid ShowMejorVendedor()
{
DIR *id_dir;
struct dirent *filedir;
FILE *archivoVendedor;
char pathFile[SIZE_FULL_PATH_FILE];
unsigned long i,x;
Lista *Ranking,*InitDir=NULL,*nuevo_elemento,*actual,*siguiente,aux;
if((id_dir=opendir(".\\Vendedores\\"))==NULL){
printf("No se pudo abrir el directorio de vendedores\n"); }else{
while((filedir = readdir(id_dir)) != NULL){
if(strcmp(filedir
->d_name
,".") != 0 && strcmp(filedir
->d_name
,"..") != 0){ sprintf(pathFile
,"Vendedores\\%s",filedir
->d_name
); archivoVendedor
=fopen(pathFile
,"rb"); if(archivoVendedor!=NULL){
//Creo una lista enlazada simple con todos los vendedores
if((nuevo_elemento
= (Lista
*) malloc(sizeof(Lista
))) == NULL
){ printf("Huvo un error al solicitar memoria para crear el ranking\n"); break;
}else{
nuevo_elemento->sig = NULL;
if(InitDir==NULL){
Ranking=nuevo_elemento;
InitDir=Ranking;
}else{
Ranking->sig=nuevo_elemento;
Ranking=Ranking->sig;
}
if(fread(&nuevo_elemento
->Vendedor
,sizeof(Ventas
),1,archivoVendedor
)==1){
}else{
printf("Huvo algun error al leer los vendedores\n"); break;
}
}
}else{
printf("Hubo algun error al leer los vendedores\n"); break;
}
}
}
closedir(id_dir);
}
//Ordeno por ventas de mayor a menor
actual=InitDir;
while(actual != NULL && actual->sig != NULL)
{
siguiente = actual->sig;
while(siguiente!=NULL)
{
if(actual->Vendedor.contadorventas < siguiente->Vendedor.contadorventas)
{
memcpy(&aux
,actual
,sizeof(Lista
)); strcpy(actual
->Vendedor.
nombre,siguiente
->Vendedor.
nombre); actual->Vendedor.ID = siguiente->Vendedor.ID;
actual->Vendedor.contadorventas = siguiente->Vendedor.contadorventas;
strcpy(siguiente
->Vendedor.
nombre,aux.
Vendedor.
nombre); siguiente->Vendedor.ID = aux.Vendedor.ID;
siguiente->Vendedor.contadorventas = aux.Vendedor.contadorventas;
}
siguiente = siguiente->sig;
}
actual = actual->sig;
siguiente = actual->sig;
}
actual=InitDir;
if(actual != NULL){
printf("------------------------------------------------\n"); while(actual != NULL){
printf("Datos del vendedor:\n"); printf("ID: %d\n",actual
->Vendedor.
ID); printf("Nombre: %s\n",actual
->Vendedor.
nombre); printf("Ventas realizadas: %d\n",actual
->Vendedor.
contadorventas); printf("------------------------------------------------\n"); actual=actual->sig;
}
}
//Libero la memoria de la lista enlazada de los vendedores
Ranking=InitDir;
while(InitDir != NULL){
InitDir=Ranking->sig;
Ranking=InitDir;
}
}
Realmente he probado a guardar las direcciones de los miembros anteriores, intercambiaba las direcciones de actual->sig y siguiente->sig y luego intercambiaba las de anteriorActual->sig y anteriorSiguiente->sig (siempre que hubiese un anterior claro) pero no lo logré. ¿alguien puede ayudarme con esto? Es algun problema con punteros y no me entero de como hacerlo
.