Hola a todos, que tal?, tengo un problemilla necesito pasar de un fichero binario en C a una lista doblemente enlazada. Yo tengo el codigo, pero no se pq no me muestra bien la lista doble, si alguien puede ayudarme por favor, aqui abajo adjunto el codigo q tengo hecho. Gracias
Esto es el codigo de las funciones.
/************** funcion para reservar memoria para el nuevo elemento*/
struct listaDoble *nuevoElemento()
{
struct listaDoble *a;
a = (struct listaDoble*)malloc(sizeof(struct listaDoble));
return a;
}
/*********** funcion que calcula si la lista esta vacia**************/
int listaVacia(struct listaDoble*cabeza)
{
if(cabeza == NULL) /*la lista esta vacia*/
return 1;
else
return 0; /*la lista no esta vacia*/
}
void leerDatosFichero(char *fichero, struct listaDoble **cabeza)
{
FILE *p;
struct listaDoble *aux;
/*se reserva espacio para el nuevo elemento*/
aux = nuevoElemento();
p = fopen("conejos2006.bin", "rb");
if(p== NULL)
{
printf("\nError de lectura del fichero\n");
exit(-1);
}
while(fscanf(p, "%s %d %lf", aux->codigo, &aux->edad, &aux->peso)==3)
{
insertarLista(cabeza, aux->codigo, aux->edad, aux->peso);
}
fclose(p);
}
/************funcion que inserta elementos al comienzo de la lista*/
void insertarLista(struct listaDoble **cabeza, char *codigo, int edad, double peso)
{
struct listaDoble *nuevo = NULL;
struct listaDoble *aux = NULL;
/*se reserva espacio para el nuevo elemento*/
nuevo = nuevoElemento();
strcpy(nuevo->codigo, codigo);
nuevo->edad = edad;
nuevo->peso = peso;
if(listaVacia(*cabeza))
{
*cabeza = nuevo;
nuevo->sig = NULL;
nuevo->anterior = NULL;
}
else {
aux = *cabeza;
nuevo->sig = aux;
aux->anterior = nuevo;
*cabeza = nuevo;
}
}
/*****************muestra los elementos de la lista desde el principio hasta el fin***/
void visualizarDirecta(struct listaDoble *cabeza)
{
if(!listaVacia(cabeza))
{
printf("\n Codigo: %s\n", cabeza->codigo);
printf(" Edad: %d\n", cabeza->edad);
printf(" Peso: %.3lf\n", cabeza->peso);
visualizarDirecta(cabeza->sig);
}
}
/****************funcion que comprueba si existe un fichero***/
int existeFichero()
{
FILE *f;
f = fopen("conejos2006.bin", "rb"); /*abre fichero para lectura*/
if(f == NULL) /*el fichero no existe*/
{
return 0;
}
else {
fclose(f);
return 1;
}
}
[QUOTE]
Aqui pongo el principal es decir el main.
[/QUOTE]
#include "cabecera.h"
main()
{
struct listaDoble *cabeza = NULL;
int opc;
int existeF;
char fichero[30];
/*
if(argc <2) {
printf("El numero de argumentos debe ser 2\n");
exit(-1);
}
*/
do{
do{
opc = menu();
}while(opc <1 || opc >10);
switch(opc)
{
case 1: /*Pasar del fichero a una lista*/
/*
guardarDatosFichero(argv[1], cabeza);
printf("\nLos datos se han guardado correctamente\n");
printf("\nPulse intro para seguir");
getchar();
getchar();*/
existeF = existeFichero();
if(existeF == 0)
{
printf("No existe el fichero conejos\n");
exit(1);
}
else {
leerDatosFichero("conejos2006.bin", &cabeza);
printf("Los datos han sido grabados\n");
visualizarDirecta(cabeza);
printf("La lista es \n");
printf("\nPulse intro para seguir");
getchar();
getchar();
}
break;
case 10:
printf("\nSALIR DEL PROGRAMA DE CONEJOS\n");
printf("\nPulse intro para seguir\n");
getchar();
break;
}
}while(opc!=10);
}
/*******************funcion del menu de opciones de la lista*****************/
int menu()
{
int opc;
system("clear");
printf("\n MENU DE PRACTICA DE LISTAS\n\n");
printf("\n 1. Pasar del fichero a lista en un fichero. ");
printf("\n 10. Salir del programa. ");
printf("\n\n Introduzca una opcion: ");
scanf("%d", &opc);
return opc;
}