Ver Mensaje Individual
  #1 (permalink)  
Antiguo 17/04/2016, 12:50
aguml
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Problemas con ordenamiento burbuja con punteros en lista simple

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 original
  1. void ShowMejorVendedor()
  2. {
  3.    DIR *id_dir;
  4.    struct dirent *filedir;
  5.    FILE *archivoVendedor;
  6.    char pathFile[SIZE_FULL_PATH_FILE];
  7.    unsigned long i,x;
  8.    Lista *Ranking,*InitDir=NULL,*nuevo_elemento,*actual,*siguiente,aux;
  9.  
  10.    if((id_dir=opendir(".\\Vendedores\\"))==NULL){
  11.       printf("No se pudo abrir el directorio de vendedores\n");
  12.    }else{
  13.       while((filedir = readdir(id_dir)) != NULL){
  14.          if(strcmp(filedir->d_name,".") != 0 && strcmp(filedir->d_name,"..") != 0){
  15.             sprintf(pathFile,"Vendedores\\%s",filedir->d_name);
  16.             archivoVendedor=fopen(pathFile,"rb");
  17.             if(archivoVendedor!=NULL){
  18.                //Creo una lista enlazada simple con todos los vendedores
  19.                if((nuevo_elemento = (Lista*) malloc(sizeof(Lista))) == NULL){
  20.                   printf("Huvo un error al solicitar memoria para crear el ranking\n");
  21.                   break;
  22.                }else{
  23.                   nuevo_elemento->sig = NULL;
  24.                   if(InitDir==NULL){
  25.                      Ranking=nuevo_elemento;
  26.                      InitDir=Ranking;
  27.                   }else{
  28.                      Ranking->sig=nuevo_elemento;
  29.                      Ranking=Ranking->sig;
  30.                   }
  31.                   if(fread(&nuevo_elemento->Vendedor,sizeof(Ventas),1,archivoVendedor)==1){
  32.  
  33.                   }else{
  34.                      printf("Huvo algun error al leer los vendedores\n");
  35.                      fclose(archivoVendedor);
  36.                      break;
  37.                   }
  38.                   fclose(archivoVendedor);
  39.                }
  40.             }else{
  41.                printf("Hubo algun error al leer los vendedores\n");
  42.                break;
  43.             }
  44.          }
  45.       }
  46.       closedir(id_dir);
  47.    }
  48.  
  49.    //Ordeno por ventas de mayor a menor
  50.    actual=InitDir;
  51.    while(actual != NULL && actual->sig != NULL)
  52.    {
  53.       siguiente = actual->sig;
  54.       while(siguiente!=NULL)
  55.       {
  56.          if(actual->Vendedor.contadorventas < siguiente->Vendedor.contadorventas)
  57.          {
  58.             memcpy(&aux,actual,sizeof(Lista));
  59.             strcpy(actual->Vendedor.nombre,siguiente->Vendedor.nombre);
  60.             actual->Vendedor.ID = siguiente->Vendedor.ID;
  61.             actual->Vendedor.contadorventas = siguiente->Vendedor.contadorventas;
  62.  
  63.             strcpy(siguiente->Vendedor.nombre,aux.Vendedor.nombre);
  64.             siguiente->Vendedor.ID = aux.Vendedor.ID;
  65.             siguiente->Vendedor.contadorventas = aux.Vendedor.contadorventas;
  66.          }
  67.          siguiente = siguiente->sig;
  68.       }
  69.       actual = actual->sig;
  70.       siguiente = actual->sig;
  71.    }
  72.    actual=InitDir;
  73.    if(actual != NULL){
  74.       printf("------------------------------------------------\n");
  75.       while(actual != NULL){
  76.          printf("Datos del vendedor:\n");
  77.          printf("ID: %d\n",actual->Vendedor.ID);
  78.          printf("Nombre: %s\n",actual->Vendedor.nombre);
  79.          printf("Ventas realizadas: %d\n",actual->Vendedor.contadorventas);
  80.          printf("------------------------------------------------\n");
  81.          actual=actual->sig;
  82.       }
  83.    }
  84.  
  85.    //Libero la memoria de la lista enlazada de los vendedores
  86.    Ranking=InitDir;
  87.    while(InitDir != NULL){
  88.       InitDir=Ranking->sig;
  89.       free(Ranking);
  90.       Ranking=InitDir;
  91.    }
  92. }

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 .