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

Lista enlazada con nodos duplicados

Estas en el tema de Lista enlazada con nodos duplicados en el foro de C/C++ en Foros del Web. Hola a todos! Este año parece ser que las bases de datos no se llevan bien conmigo!!! Resulta que tengo una base de datos en ...
  #1 (permalink)  
Antiguo 10/01/2010, 03:22
Avatar de calathea  
Fecha de Ingreso: octubre-2008
Ubicación: Valladolid
Mensajes: 122
Antigüedad: 16 años
Puntos: 3
Busqueda Lista enlazada con nodos duplicados

Hola a todos!
Este año parece ser que las bases de datos no se llevan bien conmigo!!!

Resulta que tengo una base de datos en la cual almaceno una lista de personajes. Se que se almacenan bien ya que tengo editor hexadecimal y he comprobado que en la base de datos no hay duplicados de personajes ni les falta ningun tipo de datos de los que yo introduzco.

Sin embargo, al cargar las bases de datos en una lista enlazada para usarlas en el programa, sin previo aviso se me duplica el último personaje que haya en ese momento en la base de datos, o triplica...he llegado incluso a tener 4 o 5 veces el mismo personaje. Además si tengo dos o más personajes, el último personaje, que es el que se duplica, cambia uno de sus atributos (archivo) por el del primer personaje.

Las funciones que empleo para guardar y cargar estos datos son las siguientes:

Cargar lista de personajes:
Código C:
Ver original
  1. void crearListaPersonajes(Personaje *personajes, char *nom_archivo)
  2. {
  3.     tipoPersonaje personaje;
  4.     FILE *ptr;
  5.     int i, num, cantidad;
  6.     long int pos;
  7.  
  8.     personajes->_next = NULL;
  9.  
  10.     // Compruebo existencia de archivo y nº de registros
  11.     num = NumRegArchivoBin(nom_archivo, sizeof(tipoPersonaje));
  12.     if(num)
  13.     {
  14.         ptr = fopen(nom_archivo, "rb");
  15.         for(i=0;i<num;i++)
  16.         {
  17.             fread((tipoPersonaje*)&personaje, sizeof(tipoPersonaje), 1, ptr);
  18.             pos = ftell(ptr);
  19.             cantidad = personaje.numResp;
  20.             personaje.answers = *crearListaRespuestas(nom_archivo, ptr, pos, cantidad);
  21.             anyadirPersonaje(personajes, personaje);
  22.         }
  23.         fclose(ptr);
  24.     } // fin if _num
  25. }

Cargar respuestas asociadas a cada personaje (la llamo desde la funcion anterior...linea 20)
Código C:
Ver original
  1. Respuestas * crearListaRespuestas(char *nom_archivo, FILE *ptr, long int pos, int cantidad)
  2. {
  3.     tipoRespuesta respuesta;
  4.     Respuestas respuestas = {0};
  5.     Respuestas *lista = calloc(sizeof(Respuestas), 1);
  6.     int i;
  7.  
  8.     lista->_next = NULL;
  9.  
  10.     for(i=0;i<cantidad;i++)
  11.     {
  12.         fread((tipoRespuesta*)&respuesta, sizeof(tipoRespuesta), 1, ptr);
  13.         anyadirRespuesta(lista, respuesta);
  14.     }
  15.  
  16.     return lista;
  17. }

Y por último, la funcion de guardar personaje:
Código C:
Ver original
  1. void guardarListaPersonajes(Personaje lista, char *nomArchivo)
  2. {
  3.     FILE *ptr;
  4.     Personaje *temp;
  5.    
  6.     // Compruebo existencia de registros
  7.     ptr = fopen(nomArchivo, "wb");
  8.     if(ptr == NULL)
  9.     {
  10.         printf("Error al abrir archivo %s\n", nomArchivo);
  11.         Pausa();
  12.         exit(0);
  13.     }
  14.  
  15.     temp = lista._next; // primer nodo de la lista
  16.     while(temp)
  17.     {
  18.         fwrite( (tipoPersonaje*) &(temp->_personaje), sizeof(tipoPersonaje), 1, ptr);
  19.         //temp->_personaje.answers = *temp->_personaje.answers._next;
  20.         while(temp->_personaje.answers._next != NULL)
  21.         {
  22.             fwrite( (tipoRespuesta*) &(temp->_personaje.answers._respuesta), sizeof(tipoRespuesta), 1, ptr);
  23.             temp->_personaje.answers = *temp->_personaje.answers._next;
  24.         }
  25.         temp=temp->_next; // siguiente nodo
  26.    }
  27.     fclose(ptr);
  28. }

El problema imagino que tendrá que estar dentro de las funciones de cargar...Si alguien me pudiera orientar para ver el error...porque la verdad es que yo ya no veo qué es lo que puede estarme fallando...

Gracias de antemano, un saludo
  #2 (permalink)  
Antiguo 17/01/2010, 06:34
Avatar de calathea  
Fecha de Ingreso: octubre-2008
Ubicación: Valladolid
Mensajes: 122
Antigüedad: 16 años
Puntos: 3
Respuesta: Lista enlazada con nodos duplicados

Lo solucioné ya...a la hora de leer me leía bien los personajes, pero como en el mismo archivo tengo guardado los personajes su correspondiente lista de respuestas, entonces al mirar a ver los personajes que había dividía todos los bytes del archivo...apareciendome así mas personajes de los normales... ;)

Etiquetas: duplicados, enlazada, lista, nodos
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 08:52.