• Jueves 18 de Abril de 2024, 04:36

Autor Tema:  Listas Dobles En C  (Leído 922 veces)

i82maria

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Listas Dobles En C
« en: Martes 6 de Junio de 2006, 17:18 »
0
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.
Código: Text
  1.  
  2. /************** funcion para reservar memoria para el nuevo elemento*/
  3. struct listaDoble *nuevoElemento()
  4. {
  5.    struct listaDoble *a;
  6.    a = (struct listaDoble*)malloc(sizeof(struct listaDoble));
  7.    return a;
  8.    
  9. }
  10.  
  11. /*********** funcion que calcula si la lista esta vacia**************/
  12. int listaVacia(struct listaDoble*cabeza)
  13. {
  14.    if(cabeza == NULL) /*la lista esta vacia*/
  15.       return 1;
  16.    else
  17.        return 0;     /*la lista no esta vacia*/
  18.  }
  19.  
  20. void leerDatosFichero(char *fichero, struct listaDoble **cabeza)
  21. {
  22.   FILE *p;
  23.   struct listaDoble *aux;
  24.  
  25.   /*se reserva espacio para el nuevo elemento*/
  26.   aux = nuevoElemento();
  27.   p = fopen("conejos2006.bin", "rb");
  28.   if(p== NULL)
  29.   {
  30.      printf("\nError de lectura del fichero\n");
  31.      exit(-1);
  32.   }
  33.  
  34.   while(fscanf(p, "%s %d %lf", aux->codigo, &aux->edad, &aux->peso)==3)
  35.   {
  36.      insertarLista(cabeza, aux->codigo, aux->edad, aux->peso);
  37.   }
  38.  
  39.   fclose(p);
  40. }
  41.  
  42. /************funcion que inserta elementos al comienzo de la lista*/  
  43.  void insertarLista(struct listaDoble **cabeza, char *codigo, int edad, double peso)
  44.  {
  45.     struct listaDoble *nuevo = NULL;
  46.     struct listaDoble *aux = NULL;
  47.    
  48.     /*se reserva espacio para el nuevo elemento*/
  49.     nuevo = nuevoElemento();
  50.     strcpy(nuevo->codigo, codigo);
  51.     nuevo->edad = edad;
  52.     nuevo->peso = peso;
  53.    
  54.     if(listaVacia(*cabeza))
  55.     {
  56.       *cabeza = nuevo;
  57.       nuevo->sig = NULL;
  58.       nuevo->anterior = NULL;
  59.     }
  60.    
  61.     else {
  62.     aux = *cabeza;
  63.      nuevo->sig = aux;
  64.      aux->anterior = nuevo;
  65.      *cabeza = nuevo;
  66.      }
  67.        
  68.  }
  69. /*****************muestra los elementos de la lista desde el principio hasta el fin***/
  70. void visualizarDirecta(struct listaDoble *cabeza)
  71. {
  72.   if(!listaVacia(cabeza))
  73.   {
  74.     printf("\n Codigo: %s\n", cabeza->codigo);
  75.     printf(" Edad: %d\n", cabeza->edad);
  76.     printf(" Peso: %.3lf\n", cabeza->peso);
  77.     visualizarDirecta(cabeza->sig);
  78.   }
  79. }
  80.  
  81.  /****************funcion que comprueba si existe un fichero***/
  82.  int existeFichero()
  83.  {
  84.    FILE *f;
  85.    f = fopen("conejos2006.bin", "rb"); /*abre fichero para lectura*/
  86.    if(f == NULL) /*el fichero no existe*/
  87.    {
  88.       return 0;
  89.    }
  90.     else {
  91.        fclose(f);
  92.        return 1;
  93.      }
  94.   }  
  95. [QUOTE]
  96. Aqui pongo el principal es decir el main.
  97. [/QUOTE]
  98.  
  99.  
#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;
}