Foros ZackYFileS

Foros ZackYFileS (http://foros.zackyfiles.com/index.php)
-   PROGRAMACIÓN Lenguajes: Visual Basic, C++, etc (http://foros.zackyfiles.com/forumdisplay.php?f=370)
-   -   Ayuda con listas enlazadas (http://foros.zackyfiles.com/showthread.php?t=621041)

antoniogas 10/04/2010 16:02

Ayuda con listas enlazadas
 
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:

Cita:

#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--------------------\n\n");
printf("Menu principal\n--------------\n");
printf(" 1) Altas\n 2) Listados\n 3) Consultas \n 4) Bajas\n 5) Modificaciones\n 6) Salir\n\nOpcion: ");
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-----------------------\n\n");
printf("Programa de altas\n--------------\n");
printf("Nuevo registro:\n\n");
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("\n\nQuiere 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----------\n\n");
printf("Listados\n--------------\n");
while(ptr != NULL)
{
printf("Registro %d:\n\n",i);
printf(" Nombre: %s\n",ptr->nombre);
printf(" Edad: %s\n",ptr->edad);
printf(" Cargo: %s\n",ptr->cargo);
printf(" Sueldo: %s\n\n",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----------\n\n");
printf("Consultas\n--------------\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:\n\n",i);
printf(" Nombre: %s\n",ptr->nombre);
printf(" Edad: %s\n",ptr->edad);
printf(" Cargo: %s\n",ptr->cargo);
printf(" Sueldo: %s\n\n",ptr->sueldo);
getch();
sw=1;
}
i++;
ptr = ptr->enlace;
}
if(!sw)
{
printf("No encontrado\n");
getch();
}
clrscr();
printf("Curriculums: \n----------\n\n");
printf("Consultas\n--------------\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----------\n\n");
printf("Bajas\n--------------\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:\n\n",i);
printf(" Nombre: %s\n",ptr->nombre);
printf(" Edad: %s\n",ptr->edad);
printf(" Cargo: %s\n",ptr->cargo);
printf(" Sueldo: %s\n\n",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("Borrado\n");
getch();
}
}
i++;
p = ptr;
ptr = ptr->enlace;
}
if(!sw)
{
printf("No encontrado\n");
getch();
}

clrscr();
printf("Curriculums: \n----------\n\n");
printf("Bajas\n--------------\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----------\n\n");
printf("Consultas\n--------------\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:\n\n",i);
printf(" Nombre: %s\n",ptr->nombre);
printf(" Edad: %s\n",ptr->edad);
printf(" Cargo: %s\n",ptr->cargo);
printf(" Sueldo: %s\n\n",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 encontrado\n");
getch();
}
clrscr();
printf("Curriculums: \n----------\n\n");
printf("Modificaciones\n--------------\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!='\0')
{
if((*cadena>=97)&&(*cadena<=122))
*cadena -= resta;
cadena++;
}

return ret;
}
Haber si me podeis ayudar.

Salu2 y gracias de antemano.

kezuziyo 10/04/2010 22:07

una lista enlazada consiste en una serie de registros o estructuras en los que al menos uno de sus campos es un puntero al siguiente registro o estructura siguiendo algún tipo de ordenación, opcionalmente también puede contener un puntero al registro anterior, e incluso otro puntero para otro criterio de ordenación. Eso sería si esos registros estuviesen en la memoria y para cada registro hubieses echo una petición de memoria mediante malloc.
Pero si la lista tiene muchos elementos es mejor mantener esos registros en el disco.
Hay dos opciones, que cada registro tenga un tamaño fijo, en tal caso lo normal sería empezar el fichero con una cabecera que nos diga cuantos registros tenemos, un puntero al primer registro válido (el número de registro mas que un puntero), quizás otro para el último, y otro puntero para la lista de registros eliminados para ser reutilizados.
Para ir al registro N tendras que hacer un fseek al offset (sizeof(cabecera)+(N-1)*sizeof(registro)), teniendo en cuenta que cada registro, a parte de contener lso datos propios (como el nombre, apellido, dirección, etc.) deberás añadir espacio para almacenar el número del próximo registro y el del anterior (con un int32 te debería sobrar). La cabecera la deberás tener siempre en memoria para agilizar el funcionamiento y deberás grabarla cada vez que sea modificada.
En caso de que el tamaño de registro sea variable se complica todo, para empezar cada registro deberá comenzar con un int32 indicando su tamaño, y después los punteros en vez de contener el número de registro tendrás que poner el offset real. Casi es mejor que reserves siempre por ejemplo 50 bytes para campos tipo nombre o dirección y así sea de tamaño fijo

antoniogas 11/04/2010 02:49

Buenas kezuzillo, todo lo que me comentas lo he utilizado en los ficheros relativos, es decir, guardar la primera "ficha" como yo la llamo para guardar el numero de registros que tiene el fichero, aparte de datos que quiera guardar, despues de esa "ficha" irían todos los datos pertenecientes al fichero. Siempre he utilizado el fseek para posicionarme en una parte especifica del fichero, y el read o write para leer dichos datos, pero el problema está en la lista enlazada, que como se puede ver, es de tamaño de registro variable, que no se que hacer para guardar esos datos en un fichero, no se como utilizar el fseek en este tipo de ficheros, ni siquiera se como leer y grabar en listas enlazadas, ya que nisiquiera lo he visto, y es este mi problema.

Espero que hayas entendido cual es mi problema.

Un saludo y gracias.

elraton 14/07/2016 18:13

esta en c++...

andorrilla 14/07/2016 18:45

Cita:

Iniciado por elraton (Mensaje 4784800)
esta en c++...

hola señor.

post anterior seis años...ojo.


La franja horaria es GMT +2. Ahora son las 16:35.

Powered por vBulletin™ Version 3.8.10
Copyright © 2019 vBulletin Solutions, Inc. All rights reserved.
Traducido por vBsoporte - vBulletin en español
ZackYFileS - Foros de Debate