Ver las NORMAS de estos Foros Web ZackYFileS Chat ZackYFileS Agregar a Favoritos Contactar con Administrador
 
 

www.PADREDEFAMILA.COM La MEJOR tienda de venta de Electronica!!
Navegación
Retroceder   Foros ZackYFileS >
OTROS TEMAS DE INTERES - INTERNET:
> PROGRAMACIÓN Lenguajes: Visual Basic, C++, etc
Nombre de usuario
Contraseña
Configuración de UsuarioAyuda (FAQs)Nuevos PostsBuscar


Respuesta
 
Herramientas
Antiguo 10/04/2010, 16:02   #1
antoniogas 
Usuario PREMIUM+
 
Avatar de antoniogas
 
Fecha de ingreso: 28/ene/2004
Mensajes: 590
antoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradable
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.
antoniogas está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Publicidad: Conoce las ofertas de ANUNCIATE
Antiguo 10/04/2010, 22:07   #2
kezuziyo
Zumbao
 
Avatar de kezuziyo
 
Fecha de ingreso: 22/ene/2004
Mensajes: 38.392
kezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatarkezuziyo Cuando busquemos reputación en Wikipedia, saldrá su avatar
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
__________________



>>>FOTO DE LA KEDADA DEL SURESTE 2008<<<
Consejos sobre como navegar por ZackY: Navegando por el foro
>>> [URL="http://www.jezuzillo.es/images/NoToros.htm"]Porque estoy en contra de las corridas de toros y de la existencia de una sección sobre las mismas en este foro[/URL] <<<
>>> [URL="http://foros.zackyfiles.com/showthread.php?t=591397"]Si quieres eliminar la sección taurina de tu navegador, pincha aquí[/URL] <<<
kezuziyo está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 11/04/2010, 02:49   #3
antoniogas 
Usuario PREMIUM+
 
Avatar de antoniogas
 
Fecha de ingreso: 28/ene/2004
Mensajes: 590
antoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradableantoniogas es realmente agradable
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.
antoniogas está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 14/07/2016, 18:13   #4
elraton
Usuario Registrado
 
Avatar de elraton
 
Fecha de ingreso: 18/oct/2009
Mensajes: 46
elraton está en el buen camino
esta en c++...
elraton está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 14/07/2016, 18:45   #5
andorrilla 
Usuario PREMIUM+
 
Avatar de andorrilla
 
Fecha de ingreso: 12/sep/2009
Mensajes: 37.148
andorrilla Leyenda viva del foroandorrilla Leyenda viva del foroandorrilla Leyenda viva del foroandorrilla Leyenda viva del foroandorrilla Leyenda viva del foroandorrilla Leyenda viva del foroandorrilla Leyenda viva del foroandorrilla Leyenda viva del foroandorrilla Leyenda viva del foroandorrilla Leyenda viva del foroandorrilla Leyenda viva del foro
Cita:
Iniciado por elraton Ver mensaje
esta en c++...
hola señor.

post anterior seis años...ojo.
__________________
andorrilla está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Antiguo 19/06/2021, 11:10   #6
mocayo
Usuario Registrado
 
Fecha de ingreso: 01/abr/2004
Mensajes: 32
mocayo está en el buen camino
menudo reflote.
mocayo está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Publicidad: Conoce las ofertas de ANUNCIATE
Respuesta


Usuarios viendo actualmente este tema: 1 (0 usuarios registrados y 1 visitantes)
 
Herramientas

Permisos para publicar mensajes
No puedes crear nuevos temas
No puedes responder mensajes
No puedes subir archivos adjuntos
No puedes editar tus mensajes

Los BB code están Activado
Los Emoticones están Activado
El código [IMG] está Activado
El Código HTML está Desactivado

Ir al foro

Temas similares
Tema Autor Foro Resp. Último mensaje
AYUDA con fichero con extension (*.tli) BARSUM PROGRAMACIÓN Lenguajes: Visual Basic, C++, etc 2 07/01/2010 23:45
Ayuda con la Elevacion de la antena jjmora ANTENAS SAT: Instalación y Orientación 1 03/01/2010 15:05
ayuda con sl65 DIGI TV amgm1971 RECEPTORES - GENERAL 1 27/11/2009 10:17


!! ADVERTENCIAS !!: Las informaciones aquí publicadas NO CONTIENEN KEYS para la decodificación de ningún sistema: NO SON OPERATIVOS en sistemas SAT que precisen de su correspondiente suscripción.

ESTA TOTALMENTE PROHIBIDO EL USO DE ESTAS INFORMACIONES PARA LA MODIFICACIÓN O  DEFRAUDACIÓN DE SISTEMAS DE ACCESO CONDICIONAL.

ESTOS FOROS SON MODERADOS Y NO SE PERMITE LA PUBLICACIÓN DE INFORMACIONES ILEGALES POR PARTE DE LOS USUARIOS. EN CASO DE DETECTARSE ESTE TIPO DE INFORMACIONES, LOS USUARIOS SERÁN EXCLUIDOS DE ESTAS PÁGINAS.

USO DE COOKIES: Utilizamos COOKIES y de terceros para mejorar nuestros servicios y navegación por la web. Si continua navegando, consideramos que acepta su uso.  


La franja horaria es GMT +2. Ahora son las 15:30.


-------------------------------------------------------------------- --------------------------------------------------------------------

Powered por vBulletin™ Version 3.8.10
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.
Traducido por vBsoporte - vBulletin en español
Hispaservicios - J.G.C - 29112549T - Rio Cinca, 2, 30 (50180) SPAIN.
Todos los derechos reservados. Prohibida cualquier reproducion total o parcial.


Foros Patrocinados por anunciantes.