Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problemas con ordenamiento burbuja con punteros en lista simple

Estas en el tema de Problemas con ordenamiento burbuja con punteros en lista simple en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 17/04/2016, 12:50
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 8 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 .
  #2 (permalink)  
Antiguo 17/04/2016, 21:04
Avatar de 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
  #3 (permalink)  
Antiguo 18/04/2016, 01:57
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Problemas con ordenamiento burbuja con punteros en lista simple

Dividir el programa en funciones pocas veces tiene tanto sentido como en tu caso.

Quieres manejar una lista simple... ¿por qué no crear una función para añadir elementos a la lista, una función para quitar elementos, ...? En vez de reescribir el mismo código 20 veces lo escribes solo una y, si resulta que tienes que modificarlo, todo el programa pasará a a beneficiarse del cambio.

Intuyo que Lista será algo más o menos asi:

Código C:
Ver original
  1. typedef struct _Lista
  2. {
  3.     struct _Lista* sig;
  4.     Ventas Vendedor;
  5. } Lista;

Llamar Lista a esta estructura no sería del todo correcto. Su nombre correcto sería Nodo y el de Lista quizás debería parecerse más a:

Código C:
Ver original
  1. typedef struct
  2. {
  3.   Nodo* primero;
  4.   int numElementos; // Para simplificar operaciones sobre la lista
  5. } Lista;

¿Por qué? Bueno, el cambio de Lista a Nodo parece obvio, realmente la estructura no es una lista sino que representa a un único nodo de la misma. Por otro lado, tener una estructura específica que pueda gestionar el inicio de la lista ayuda a que el programa pueda ganar mucha claridad.

Con esto, las funciones básicas de manipulación podrían quedar tal que:

Código C:
Ver original
  1. // Devuelve una lista inicializada.
  2. Lista NuevaLista()
  3. {
  4.   Lista toReturn;
  5.   toReturn.primero = 0;
  6.   toReturn.numElementos = 0;
  7.  
  8.   return toReturn;
  9. }
  10.  
  11. // Añade un nuevo nodo a la lista
  12. Nodo* NuevoNodo(Lista* lista)
  13. {
  14.   Nodo* nuevo = (Nodo*)calloc(1,sizeof(Nodo));
  15.  
  16.   if( lista->primero== 0 )
  17.     lista->primero= nuevo;
  18.   else
  19.   {
  20.     Nodo* ultimo = lista->primero;
  21.     while( ultimo->sig != 0)
  22.       ultimo = ultimo->sig;
  23.  
  24.     ultimo->sig = nuevo;
  25.   }  
  26.  
  27.   lista->numElementos++;
  28.  
  29.   return nuevo;
  30. }
  31.  
  32. // Elimina todos los nodos de la lista
  33. void LimpiarLista(Lista* lista)
  34. {
  35.   Nodo* nodo = lista->primero;
  36.  
  37.   while( nodo )
  38.   {
  39.     Nodo* temp = nodo->sig;
  40.     free(nodo);
  41.     nodo = temp;
  42.   }
  43.  
  44.   lista->primero = 0;
  45.   lista->numElementos = 0;
  46. }
  47.  
  48. // Saca un nodo, si existe, de la lista.
  49. // Nota que si la función retorna 1, nodo ya no es válido
  50. int EliminarNodo(Lista* lista, Nodo* nodo)
  51. {
  52.   int toReturn = 0;
  53.  
  54.   if( lista->primero == nodo )
  55.   {
  56.     lista->primero = nodo->sig;
  57.     toReturn = 1;
  58.   }
  59.   else
  60.   {
  61.     Nodo* anterior = lista->primero;
  62.  
  63.     while( anterior->sig && anterior->sig != nodo )
  64.       anterior = anterior->sig;
  65.  
  66.     if( anterior->sig )
  67.     {
  68.       anterior->sig = nodo->sig;
  69.       toReturn = 1;
  70.     }
  71.   }
  72.  
  73.   if( toReturn )
  74.   {
  75.     lista->numElementos--;
  76.     free(nodo);
  77.   }
  78.  
  79.   return toReturn;
  80. }

Con este catálogo la utilización de la lista se simplifica enormemente. Al catálogo actual habría que ir añadiendo otras funciones de interés en función de la naturaleza de la lista y de los requisitos de la aplicación... por ejemplo la posibilidad de ordenar la lista:

Código C++:
Ver original
  1. void OrdenarPorVentasMayor(Lista* lista)
  2. {
  3.   // Estructura auxiliar para ordenar
  4.   // El último nodo será 0 para simplificar el proceso
  5.   Nodo** nodos = (Nodo**)calloc(lista->numElementos+1,sizeof(Nodo*));
  6.  
  7.   // Se copian los nodos de la lista a nuestro arreglo
  8.   Nodo* nodo = lista->primero;
  9.   int index = 0;
  10.   while(nodo)
  11.   {
  12.     nodos[index] = nodo;
  13.     index++;
  14.     nodo = nodo->sig;
  15.   }
  16.  
  17.   // Se ordenan los nodos
  18.   for (int i = 0 ; i < lista->numElementos-1; i++)
  19.   {
  20.     for (int j = 0 ; j < lista->numElementos - i - 1; j++)
  21.     {
  22.       if ( nodos[j]->Vendedor.contadorventas < nodos[j+1]->Vendedor.contadorventas)
  23.       {
  24.         Nodo* swap  = nodos[j];
  25.         nodos[j]  = nodos[j+1];
  26.         nodos[j+1] = swap;
  27.       }
  28.     }
  29.   }
  30.  
  31.   // Se reconstruye la lista
  32.   lista->primero = nodos[0];
  33.   for( int i=0; i<lista->numElementos; i++)
  34.   {
  35.     // Como el último nodo es NULL, el último nodo real de la lista acabará apuntando a NULL automáticamente
  36.     nodos[i]->sig = nodos[i+1];
  37.   }
  38.  
  39.   free(nodos);
  40. }

Una forma muy sencilla de ordenar una lista enlazada (o doblemente enlazada) consiste en crear un vector de punteros a nodos. Se ordenan los punteros en dicho vector y, finalmente, se recorre ese vector ordenado para actualizar los enlaces entre los nodos. En el caso de una lista simple se puede crear la lista con un elemento "fantasma" al final para que el último nodo de la lista se quede apuntando siempre a null.

Y, como te ha dicho Instru, el código cuanto más sencillo, mejor.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #4 (permalink)  
Antiguo 18/04/2016, 09:41
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 8 meses
Puntos: 3
Respuesta: Problemas con ordenamiento burbuja con punteros en lista simple

Muchas gracias a todos por contestar y me gustaría aclarar algunas cosas.
Lo primero es sobre lo de poner muchos condicionales anidados. El caso es que cuando me enseñaron en otros lenguajes me dijeron que una función tiene que tener una entrada y una salida y que no era bueno poner varios return por toda la funcion ya que hacía más complicado dar con un error. Me dijeron que todo lo que se hace con un return se puede hacer con un condicional y eso hago desde entonces.
Otra cuestión, la lista es una lista auxiliar. ¿por qué? Pues porque solo se usa en ese código que veis y su única función es obtener los registros de un archivo y ordenarlos para mostrarlos ordenados. Por eso no lo hice separando en funciones ya que no voy a sacar mucho beneficio porque solo se usarán ahí ya que en todo el código trabajo con archivos y no con listas. Si me decís que aún así es mejor separar cada cosa en una función pues lo haré.
Ecfisa tu función de ordenación me ha gustado mucho .
Queda pendiente de vuestras respuestas.
  #5 (permalink)  
Antiguo 18/04/2016, 10:01
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Problemas con ordenamiento burbuja con punteros en lista simple

Cita:
Iniciado por aguml Ver Mensaje
Lo primero es sobre lo de poner muchos condicionales anidados. El caso es que cuando me enseñaron en otros lenguajes me dijeron que una función tiene que tener una entrada y una salida y que no era bueno poner varios return por toda la funcion ya que hacía más complicado dar con un error. Me dijeron que todo lo que se hace con un return se puede hacer con un condicional y eso hago desde entonces.
Es una buena práctica salvo cuando va en detrimento de la legibilidad del código.

Lo primero antes de nada es tener código legible, fácil de mantener y de ampliar y luego viene todo lo demás.

De nada te sirve tener un único return por función si luego tienes que invertir varias horas solo en entender lo que hace.

Por cierto, una forma de evitar tener varios returns es usar excepciones para la gestión de errores.

Cita:
Iniciado por aguml Ver Mensaje
Otra cuestión, la lista es una lista auxiliar. ¿por qué?
En una lista enlazada simple cada nodo únicamente conoce al nodo que le sigue. Reubicar un solo nodo en una lista simple implica realizar modificaciones en al menos 3 nodos diferentes:
  • El nodo a cambiar
  • El nodo que actualmente apunta al nodo a cambiar
  • El nodo anterior a la nueva posición

Al extraer todos los nodos a un vector puedes ignorar toda esa operativa ya que no es necesario que los nodos se apunten de forma conveniente... después se reordena ese vector (como aquí no tienes lista enlazada puedes recolocar los nodos arbitrariamente sin preocupaciones) y finalmente se actualizan todos los "sig" para que la lista enlazada vuelva a ser válida. Solución sencilla, rápida y a mi modo de ver, elegante.

Otra cosa es que la lista se vaya ordenando sobre la marcha al añadir nuevos elementos. En ese caso puedes calcular su posición sobre la marcha y te ahorras esta función. Eso sí, tendrás que tener cuidado a la hora de modificar nodos ya insertados en la lista ya que eso podría requerir recolocar dicho nodo.

Cita:
Iniciado por aguml Ver Mensaje
Por eso no lo hice separando en funciones ya que no voy a sacar mucho beneficio porque solo se usarán ahí ya que en todo el código trabajo con archivos y no con listas.
Que no vayas a reutilizar el código no es excusa para no tener el código bien estructurado.

Tener funciones más o menos pequeñas, legibles y completas tiene varias ventajas:
  • separación de responsabilidades: Una función pequeña suele tener un objetivo normalmente bien definido. Separar responsabilidades suele ser vital para el buen desempeño de un programa
  • aislamiento: El código que pertenece a una función queda aislado del resto del programa y únicamente se puede acceder a él a través de la propia función. Esto evita que las diferentes operativas se entremezclen entre sí creando una suerte de código espaguetti.
  • testing: Una función sencilla y bien definida admite ser tratada por una batería de test que certifique que dicha función cumple su cometido sin errores... testear una megafunción es bastante más complejo.
  • legibilidad: El programa es mucho más legible. Aunque no entiendas un algoritmo concreto siempre tendrás más idea sobre el funcionamiento de un programa si tienes "leerDato()" o"vaciarLista()" en vez de "leeDatoImprimeMatrizYHacePiruetasVarias()"
  • Reutilización del código: puede que una función únicamente sea llamada desde un sitio... pero eso no tiene que ser siempre así y tener código duplicado es una lacra en la inmensa mayoría de los programas.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #6 (permalink)  
Antiguo 18/04/2016, 15:43
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 8 meses
Puntos: 3
Respuesta: Problemas con ordenamiento burbuja con punteros en lista simple

Ok. En cuanto pueda realizo cambios. Otra cosa, si llamo por ejemplo a la función por decir algo "ImprimirClientes" desde por ejemplo el main, ¿es una buena práctica que la función muestre mensajes de error por ejemplo por pantalla o lo que debería es retornar un valor que indique el tipo de error y gestionar el error en el main?
  #7 (permalink)  
Antiguo 18/04/2016, 22:16
Avatar de 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

Cita:
Iniciado por aguml Ver Mensaje
Ok. En cuanto pueda realizo cambios. Otra cosa, si llamo por ejemplo a la función por decir algo "ImprimirClientes" desde por ejemplo el main, ¿es una buena práctica que la función muestre mensajes de error por ejemplo por pantalla o lo que debería es retornar un valor que indique el tipo de error y gestionar el error en el main?
Todo depende de la complejidad de tu programa. De hecho el manejo de errores es de las cosas mas complicadas en C puro. En C++ existen las excepciones, pero tampoco son perfectas.

Si lo que quieres es depurar, puedes usar puros mensajes en consolas (si por alguna razón no quieres usar un depurador).

La devolución de códigos de error es mas bien para saber que hacer con los errores.
En sistemas que "no deben" fallar, se debe tener un buen manejo integral de errores. Es decir, que si algo malo pasa, el programa no truene, que se recupere y que siga trabajando normalmente. Esto es casi imposible de lograr al 100%, aunque como ejemplos tenemos los videojuegos para consolas, los sistemas de cirugías asistidas por computadoras, software espacial, en cierta medida los sistemas operativos, etc.

Si te das cuenta, son sistemas que corren durante un largo periodo de tiempo y se espera que no fallen. Sin embargo, la ley de Murphy dice que si algo puede fallar de alguna forma, lo hará jaja.

En tu caso particular, supongo que lo que buscas es mas aprender. Aquí te recomiendo que si pongas mensajes en consola justo en donde ocurren. No es necesario manejarlos en el main. Esto puede ayudarte a entender mejor tu programa.

Siempre piensa que alguien desconocido va a leer tu código y debe entenderlo lo más rápido posible. Es mas fácil leer el mensaje de error, justo donde ocurrió en vez de ver 20 mensajes de error en un lugar lejano, y aparte, en el lugar del error, solo ver un código.

Si te pasas a C++, en general las excepciones son el mejor mecanismo de manejo de errores, pero hay algunas ocaciones donde incluso se llegan a usar sentencias goto.

Saludos
  #8 (permalink)  
Antiguo 18/04/2016, 23:14
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Problemas con ordenamiento burbuja con punteros en lista simple

Como añadido a lo dicho por Instru:

Si decides que la mejor solución en un momento dado es que el programa retorner códigos de error lo más recomendable es usar un enumerado, de tal forma que cada etiqueta del enumerado sea lo más descriptiva posible sobre el error que va a gestionar. De esta forma consigues que el error sea auto explicativo.

Las excepciones suelen tener un par de problemas asociados si se programa sin cuidado:
  • Fugas de memoria: cuando se lanza una excepción la traza de la aplicación irá retrocediendo hasta que se encuentre con una gestión de excepciones. Al retroceder en la traza las funciones que estaban a medio ejecutar se cancelan, pudiendo no ejecutarse instrucciones necesarias como delete. Además de ser un poco cuidadosos con la gestión de excepciones es recomendable pasar a usar smartphone pointers y dejarse de punteros crudos tipo POO* mivar.
  • Inconsistencias: una excepción, por lo comentado antes sobre la traza, deja funciones a medio terminar. Esto puede provocar que los objetos se queden en un estado inconsistente si no se programan con un poco de cariño. Imagínate que un objeto va almacenando en una variable destinada a resultados finales un resultado parcial y se provoca una excepción...

Ah sí y por supuesto no crear las excepciones con new que no nos gustan las fugas de memoria jejejeje

Un saludo
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #9 (permalink)  
Antiguo 19/04/2016, 10:25
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 8 meses
Puntos: 3
Respuesta: Problemas con ordenamiento burbuja con punteros en lista simple

Bueno ya actualicé mi código y seguí vuestro consejo de dividir el codigo en funciones mas pequeñas para hacerlo mas manejable y todo iba bien hasta que me metí con la función "AddSale" la cual era enorme. Me ha costado dividirla y aparentemente hace lo que quiero pero cuando llega al final y tiene que eliminar el archivo del vendedor y renombrar el auxiliar para así guardar los cambios veo que por alguna razón "remove" no puede borrar el archivo y por tanto no puedo renombrar después. Supongo que en algún punto, en alguna función que llamo dentro y que trabaja con el archivo lo abre y no lo cierra pero no veo el fallo y llevo toda la tarde dándole vueltas y traceando el código con el depurador.
¿Podeis ayudarme?

Os pongo todo el código necesario función. Lo he subido a pastebin porque es muy grande para subirlo directamente aquí: http://pastebin.com/H7XJRmLf
  #10 (permalink)  
Antiguo 19/04/2016, 17:33
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 8 meses
Puntos: 3
Respuesta: Problemas con ordenamiento burbuja con punteros en lista simple

Ya vi el fallo. Ahora me queda seguir corrigiendo fallidos que vea.

Etiquetas: burbuja, char, int, lista, ordenamiento, punteros, simple
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:05.