• Lunes 29 de Abril de 2024, 05:12

Autor Tema:  Listas enlazadas  (Leído 2503 veces)

antoniogas

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Listas enlazadas
« en: Jueves 15 de Abril de 2010, 18:16 »
0
Buenas a todos, comentaros que en clase me han mandado hacer el mantenimiento de un fichero con lista enlazadas y que los datos se guarden en un fichero para que al volverlo a ejecutar, los datos sigan ahí, comentaros que he manejado ficheros binarios, relativos, batch, indexados y estructuras relativas, pero no se que hacer para guardar los datos de una lista enlazada en un fichero, aquí os dejo el código de todo lo que tengo hecho hasta ahora:

Citar
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <conio.h>
#include <string.h>
#include <math.h>

typedef struct nodo
{
   char nombre[20];
   char edad[3];
   char cargo[9];
   char sueldo[10];
   struct nodo *enlace;
}Personal;

void altas(Personal **);
void listados(Personal *);
void consultas(Personal *);
void bajas(Personal **);
void modificaciones(Personal *);
char *strtoupper(char *);

int main()
{
   Personal *lista=NULL;
   int opc, exit=0;
   enum {ALTAS=1, LISTADOS, CONSULTAS, BAJAS, MODIFICACIONES, EXIT};


   do
   {
      clrscr();
      printf("Curriculum (listas):n--------------------nn");
      printf("Menu principaln--------------n");
      printf(" 1) Altasn 2) Listadosn 3) Consultas n 4) Bajasn 5) Modificacionesn 6) SalirnnOpcion: ");
      scanf("%d",&opc);

      switch(opc)
      {
         case ALTAS:
            altas(&lista);
            break;

         case LISTADOS:
            listados(lista);
            break;

         case CONSULTAS:
            consultas(lista);
            break;

         case BAJAS:
            bajas(&lista);
            break;

         case MODIFICACIONES:
            modificaciones(lista);
            break;

         case EXIT:
            exit=1;
            break;

         default:
         {
            printf("Opcion incorrecta");
            getch();
         }
      }
   }while(!exit);

   clrscr();
   printf("Hasta luego :)");

   free(lista);

   return 0;
}

void altas(Personal **ptr)
{
   Personal *nuevo, *ptr2;

   do
   {
      ptr2 = *ptr;
      nuevo = (Personal *) malloc(sizeof(Personal));
      clrscr();
      printf("Curriculums: n-----------------------nn");
      printf("Programa de altasn--------------n");
      printf("Nuevo registro:nn");
      fflush(stdin);
      printf(" Nombre: ");
      gets(nuevo->nombre);
      printf(" Edad: ");
      gets(nuevo->edad);
      printf(" Cargo: ");
      gets(nuevo->cargo);
      printf(" Sueldo: ");
      gets(nuevo->sueldo);
      nuevo->enlace = NULL;

      if(*ptr==NULL)
         *ptr = nuevo;
      else
      {
         while(ptr2->enlace != NULL)
            ptr2 = ptr2->enlace;

         ptr2->enlace = nuevo;
      }

      printf("nnQuiere introducir mas registros (s/n)? => ");

   } while (toupper(getchar()) == 'S');

   clrscr();
   printf("Fin del programa de altas, pulsa una tecla para volver al menu");
   getch();
}

void listados(Personal *ptr)
{
   int i = 1;
   clrscr();
   printf("Curriculums: n----------nn");
   printf("Listadosn--------------n");
   while(ptr != NULL)
   {
      printf("Registro %d:nn",i);
      printf(" Nombre: %sn",ptr->nombre);
      printf(" Edad: %sn",ptr->edad);
      printf(" Cargo: %sn",ptr->cargo);
      printf(" Sueldo: %snn",ptr->sueldo);
      getch();
      ptr = ptr->enlace;
      i++;
   }

   printf("Fin del programa de listados, pulsa una tecla para volver al menu");
   getch();
}

void consultas(Personal *lista)
{
   Personal *ptr;
   int i=1,sw=0;
   char cons[20];

   clrscr();
   printf("Curriculums: n----------nn");
   printf("Consultasn--------------n");
   printf("Nombre a buscar (FIN para terminar): ");
   fflush(stdin);
   gets(cons);
   while(strncmp(strtoupper(cons),"FIN",3)!=0)
   {
      ptr = lista;
      while(ptr != NULL)
      {
         if(strncmp(strtoupper(ptr->nombre),strtoupper(cons),strlen(cons))==0)
         {
            printf("Registro %d:nn",i);
            printf(" Nombre: %sn",ptr->nombre);
            printf(" Edad: %sn",ptr->edad);
            printf(" Cargo: %sn",ptr->cargo);
            printf(" Sueldo: %snn",ptr->sueldo);
            getch();
            sw=1;
         }
         i++;
         ptr = ptr->enlace;
      }
      if(!sw)
      {
         printf("No encontradon");
         getch();
      }
      clrscr();
      printf("Curriculums: n----------nn");
      printf("Consultasn--------------n");
      printf("Nombre a buscar (FIN para terminar): ");
      gets(cons);
      sw=0;
      i=1;
   }
}


void bajas(Personal **lista)
{
   Personal *ptr, *p, *p1, *p2;
   int i=1,sw=0;
   char cons[20];

   clrscr();
   printf("Curriculums: n----------nn");
   printf("Bajasn--------------n");
   printf("Nombre a buscar (FIN para terminar): ");
   fflush(stdin);
   gets(cons);
   while(strncmp(strtoupper(cons),"FIN",3)!=0)
   {
      ptr = *lista;
      while(ptr != NULL)
      {
         if(strncmp(strtoupper(ptr->nombre),strtoupper(cons),strlen(cons))==0)
         {
            printf("Registro %d:nn",i);
            printf(" Nombre: %sn",ptr->nombre);
            printf(" Edad: %sn",ptr->edad);
            printf(" Cargo: %sn",ptr->cargo);
            printf(" Sueldo: %snn",ptr->sueldo);
            getch();
            sw=1;

            printf("¿Seguro que quieres borrar este registro?(s/n) ");
            if(toupper(getch())=='S')
            {
               if(ptr == *lista)
               {
                  p = *lista;
                  if(p != NULL)
                  {
                     p = p->enlace;
                     free(*lista);

                  }
                  *lista = p;
               }
               else if(ptr->enlace == NULL)
               {
                  p1 = *lista;
                  if(p1 != NULL)
                  {
                     if(p1->enlace == NULL)
                     {
                        free(*lista);
                        *lista = NULL;
                     }
                     else
                     {
                        while(p1->enlace != NULL)
                        {
                           p2 = p1;
                           p1 = p1->enlace;
                        }
                        p2->enlace = NULL;
                        free(p1);
                     }
                  }
               }
               else
               {
                  p->enlace = ptr->enlace;
                  free(ptr);
               }

               printf("Borradon");
               getch();
            }
         }
         i++;
         p = ptr;
         ptr = ptr->enlace;
      }
      if(!sw)
      {
         printf("No encontradon");
         getch();
      }

      clrscr();
      printf("Curriculums: n----------nn");
      printf("Bajasn--------------n");
      printf("Nombre a buscar (FIN para terminar): ");
      gets(cons);
      sw=0;
   }
}

void modificaciones(Personal *lista)
{
   Personal *ptr;
   int i=1,sw=0;
   char cons[20];

   clrscr();
   printf("Curriculums: n----------nn");
   printf("Consultasn--------------n");
   printf("Nombre a buscar (FIN para terminar): ");
   fflush(stdin);
   gets(cons);
   while(strncmp(strtoupper(cons),"FIN",3)!=0)
   {
      ptr = lista;
      while(ptr != NULL)
      {
         if(strncmp(strtoupper(ptr->nombre),strtoupper(cons),strlen(cons))==0)
         {
            printf("Registro %d:nn",i);
            printf(" Nombre: %sn",ptr->nombre);
            printf(" Edad: %sn",ptr->edad);
            printf(" Cargo: %sn",ptr->cargo);
            printf(" Sueldo: %snn",ptr->sueldo);
            getch();
            sw=1;
            printf("¿Quieres modificar este registro?(s/n) ");
            if(toupper(getch())=='S')
            {
               printf("n Nombre: ");
               gets(ptr->nombre);
               printf("n Edad: ");
               gets(ptr->edad);
               printf(" Cargo: ");
               gets(ptr->cargo);
               printf(" Sueldo: ");
               gets(ptr->sueldo);
               printf("nRegistro %d modificado",i);
               getch();
            }
         }
         i++;
         ptr = ptr->enlace;
      }
      if(!sw)
      {
         printf("No encontradon");
         getch();
      }
      clrscr();
      printf("Curriculums: n----------nn");
      printf("Modificacionesn--------------n");
      printf("Nombre a buscar (FIN para terminar): ");
      gets(cons);
      sw=0;
   }
}

char *strtoupper(char *cadena)
{
   int resta = 32;
   char *ret;

   ret = cadena;
   while(*cadena!='')
   {
      if((*cadena>=97)&&(*cadena<=122))
         *cadena -= resta;
      cadena++;
   }

   return ret;
}

Haber si me podeis ayudar.

Salu2 y gracias de antemano.

antoniogas

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Listas enlazadas
« Respuesta #1 en: Viernes 23 de Abril de 2010, 08:51 »
0
Nadie sabe como grabar en un fichero una lista enlazada??

Jeysscarr

  • Miembro MUY activo
  • ***
  • Mensajes: 134
  • Nacionalidad: co
    • Ver Perfil
Re: Listas enlazadas
« Respuesta #2 en: Viernes 23 de Abril de 2010, 17:20 »
0
Este es un ejemplo sencillo

Código: C++
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. typedef struct n *pnodo;
  5. typedef struct n
  6. {
  7.     int LU;
  8.     pnodo sig;
  9. }nodo;
  10.  
  11. void CargarListaEnteros(pnodo *lista)
  12. {
  13.     pnodo aux;
  14.  
  15.     aux=(pnodo) malloc (sizeof(nodo));
  16.  
  17.     printf("Ingrese un numero para la lista:n");
  18.     scanf("%i",&(aux->LU));
  19.     getc(stdin);
  20.  
  21.     (*lista)=aux;
  22.  
  23.     while(aux->LU!=(-1))
  24.     {
  25.         aux->sig=(pnodo) malloc (sizeof(nodo));
  26.         aux=aux->sig;
  27.         printf("Ingrese un numero para la lista:n");
  28.         scanf("%i",&(aux->LU));
  29.         getc(stdin);
  30.     }
  31.     aux->sig=NULL;
  32. }
  33.  
  34. void MostrarLista(pnodo lista)
  35. {
  36.     int nro=1;
  37.     pnodo aux;
  38.     aux=lista;
  39.  
  40.     while(aux!=NULL)
  41.     {
  42.         printf("|Lista: %i|LU: %i|n",nro,aux->LU);
  43.         aux=aux->sig;
  44.         nro++;
  45.     }
  46. }
  47.  
  48. void CopiarLISTAdeEnterosEnArch(pnodo copialista)
  49. {
  50.     FILE  *archivobin, *archivotxt;
  51.     int nro;
  52.     char caracter;
  53.  
  54.     printf("Escribir la lista de los legajos de los alumnos en un archivo:n");
  55.     printf("(B)inario o de texto (cualquier letra): ");
  56.     scanf("%c",&caracter);
  57.     getc(stdin);
  58.  
  59.     archivobin=fopen("Listalumnos.alu","wb");
  60.     archivotxt=fopen("Listalumnos.txt","w");
  61.  
  62.     if((archivotxt==NULL)&&(archivotxt==NULL))
  63.         printf("Error al acceder a los archivos...n");
  64.     else
  65.     {
  66.         while(copialista!=NULL)
  67.         {
  68.             if(caracter=='B')
  69.             {
  70.                 nro=copialista->LU;
  71.                 fwrite(&nro,sizeof(int),1,archivobin);
  72.             }
  73.             else
  74.                 fprintf(archivotxt,"%in",copialista->LU);
  75.             copialista=copialista->sig;
  76.         }
  77.     }
  78.     fclose(archivobin);
  79.     fclose(archivotxt);
  80. }
  81.  
  82. int main (void)
  83. {
  84.     pnodo lista=NULL;
  85.  
  86.     printf("Se Cargara la lista de legajos de Alumnos|con -1 termina y se lo incluye ademas:nn");
  87.     CargarListaEnteros(&lista);
  88.     printf("n");
  89.     printf("La lista resultante es:n");
  90.     MostrarLista(lista);
  91.     printf("n");
  92.     printf("Se copia la lista resultante en un archivo:n");
  93.     CopiarLISTAdeEnterosEnArch(lista);
  94.  
  95.     return 0;
  96. }
  97.  
Nuestro poder está creciendo mas rápido que nuestra sabiduria