Ver Mensaje Individual
  #2 (permalink)  
Antiguo 17/04/2016, 21:04
Avatar de Instru
Instru
 
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años
Puntos: 52
Respuesta: Problemas con ordenamiento burbuja con punteros en lista simple

Hola.
Sinceramente no entiendo exactamente que intentas hacer ni que es lo que no funciona. Pero lo que si te puedo ayudar es a que tu sólito entiendas mejor tu código.

En primer lugar, tienes demasiados niveles anidados, es decir: while-if-if-if-else-if.....
Esto dificulta muchísimo poder seguir y leer tu propio código. Muchas veces los errores son ocasionados por el abuso de estructuras de control anidadas.

Como resolverlo.

En muchos ifs tienes que el caso verdadero realiza muchas operaciones y el falso sólo da un mensaje de error. Invierte esos ifs y usa returns solitos:

Código C++:
Ver original
  1. if ((id_dir = opendir(".\\Vendedores\\")) == NULL)
  2.     {
  3.         printf("No se pudo abrir el directorio de vendedores\n");
  4.         return;
  5.     }
  6.  
  7.  
  8.     while ((filedir = readdir(id_dir)) != NULL)
  9.     {
  10.         if (strcmp(filedir->d_name, ".") == 0 && strcmp(filedir->d_name, "..") == 0)
  11.         {
  12.             break;
  13.         }
  14.         sprintf(pathFile, "Vendedores\\%s", filedir->d_name);
  15.         archivoVendedor = fopen(pathFile, "rb");
  16.         if (archivoVendedor == NULL)
  17.         {
  18.             printf("Hubo algun error al leer los vendedores\n");
  19.             break;
  20.         }
  21.  
  22.         //Creo una lista enlazada simple con todos los vendedores
  23.         if ((nuevo_elemento = (Lista *) malloc(sizeof(Lista))) == NULL)
  24.         {
  25.             printf("Huvo un error al solicitar memoria para crear el ranking\n");
  26.             return;
  27.         }
  28.         nuevo_elemento->sig = NULL;
  29.         if (InitDir == NULL)
  30.         {
  31.             Ranking = nuevo_elemento;
  32.             InitDir = Ranking;
  33.         }
  34.         else
  35.         {
  36.             Ranking->sig = nuevo_elemento;
  37.             Ranking = Ranking->sig;
  38.         }
  39.         if (fread(&nuevo_elemento->Vendedor, sizeof(Ventas), 1, archivoVendedor) == 1)
  40.         {
  41.  
  42.         }
  43.         else
  44.         {
  45.             printf("Huvo algun error al leer los vendedores\n");
  46.             fclose(archivoVendedor);
  47.             break;
  48.         }
  49.         fclose(archivoVendedor);
  50.  
  51.     }

Esto es un ejemplo. Habría que revisar bien cada caso.

Por otro lado. Tienes muchas operaciones en una sola función. Una de las prácticas que mas te salvarán es la siguiente: Tus funciones deben ser cortas (muy cortas) y sobre todo, que lo poco que hacen, lo hagan bien. Es mas fácil hacer pequeñas funciones que cumplan su tarea perfectamente, que una función gigante con mil tareas. Es la base de tener una buena abstracción del problema.

Trata de no tener expresiones demasiado complejas dentro de los condicionales de un while o un if:

Código C++:
Ver original
  1. if(strcmp(filedir->d_name,".") != 0 && strcmp(filedir->d_name,"..") != 0)
es mas legible asi:

Código C++:
Ver original
  1. int is_current_dir = strcmp(filedir->d_name,".");
  2. int is_previous_dir = strcmp(filedir->d_name,"..");
  3. if( !is_current_dir && !is_previous_dir)

Si. es más código, pero de que te sirve código comprimido, cuando no funciona?

SIEMPRE inicializa tus punteros. Y Aunque es mas cuestión de gustos, es mas legible que cada variable este definida en una linea diferente.

Todo esto se llama refactorizar código. Y si quieres se un buen programador, debes dominarlo.
Intenta limpiar tu código y verás que hasta con punteros te sale.

Saludos