listas enlazadas en archivos
TRANSCRIPT
5/12/2018 LISTAS ENLAZADAS EN ARCHIVOS - slidepdf.com
http://slidepdf.com/reader/full/listas-enlazadas-en-archivos-55a237d477f70 1/13
UNIVERSIDAD NACIONAL DE TRUJILLO
FACULTAD DE CIENCIAS FÍSICAS Y MATEMÁTICAS
ESCUELA DE INFORMÁTICA
ORGANIZACIÓN DE ARCHIVOS
“LISTAS ENLAZADAS”
AUTORES:
Alfaro Alonso Elvis
Príncipe Orbegozo Luis
Rodríguez Cosavalente Jham
Trujillo - Perú
2011
5/12/2018 LISTAS ENLAZADAS EN ARCHIVOS - slidepdf.com
http://slidepdf.com/reader/full/listas-enlazadas-en-archivos-55a237d477f70 2/13
1
Manipulación de archivos con listas enlazadas
Recordando:
Listas Enlazadas
Una lista es una estructura de datos que nos permite agrupar elementos de una manera organizada.Las listas están compuestas por nodos, estos nodos tienen un dato o valor y un puntero a otro(s)
nodo(s).Una lista enlazada tiene un conjunto de nodos, los cuales almacenan 2 tipos de información: El dato
que contienen y un puntero al siguiente nodo en la lista. El último nodo de la lista tiene como
siguiente nodo el valor NULL. Entonces las listas enlazadas simples solo pueden ser recorridas en
una dirección, apuntando al nodo siguiente, mas no a un nodo anterior.
Ejemplo:9-> 5-> 3-> 8-> 1-> NULL
Gráficamente:
Obviamente, internamente no existen las palabras nodo, dato, dirección y siguiente, es solo una
representación.
Como una lista es una estructura de datos dinámica, el tamaño de la misma puede cambiar durante
la ejecución del programa.
Definición Lista Simple - DinámicaEs una secuencia de 0 o más elementos de un tipo de dato determinado, formando un grupo unidos
por una ligadura entre los diferentes elementos (llamados ahora Nodos); esto da lugar a la existencia
de dos sub-elementos en el Nodo que son: dato (elemento dato) y ligadura (referencia), usando
dinámicamente la memoria.
5/12/2018 LISTAS ENLAZADAS EN ARCHIVOS - slidepdf.com
http://slidepdf.com/reader/full/listas-enlazadas-en-archivos-55a237d477f70 3/13
2
La lista consta de una colección de nodos situados en la memoria dinámica conectados entre sí.
Cada Nodo Cada nodo se compone de un dato y una referencia al siguiente nodo de la lista. El
último nodo de la lista contiene una referencia siguiente NULL.
¿Cómo aplicar Listas Enlazadas en Archivos?
Archivo
desordenado
Reporte deseado: listadoen orden por nombre
5/12/2018 LISTAS ENLAZADAS EN ARCHIVOS - slidepdf.com
http://slidepdf.com/reader/full/listas-enlazadas-en-archivos-55a237d477f70 4/13
3
Para reportar ordenadamente se debe:
La solución anterior tiene un defecto, si el archivo es grande, la complejidad computacional
aumenta:
NRS →∞
n=NRS
5/12/2018 LISTAS ENLAZADAS EN ARCHIVOS - slidepdf.com
http://slidepdf.com/reader/full/listas-enlazadas-en-archivos-55a237d477f70 5/13
4
Aplicamos Lista enlazada:
Recordando como ingresamos elementos en Listas Enlazadas:
a) Ingresamos al final de la Lista
b) Ingresamos al inicio de la Lista
5/12/2018 LISTAS ENLAZADAS EN ARCHIVOS - slidepdf.com
http://slidepdf.com/reader/full/listas-enlazadas-en-archivos-55a237d477f70 6/13
5
c) Ingresamos en un cualquier lugar de la Lista
Pensando en archivos insertamos registros: I(P), I(K), I(B), I(M).
I(P): I(K):
I(B): I(M):
5/12/2018 LISTAS ENLAZADAS EN ARCHIVOS - slidepdf.com
http://slidepdf.com/reader/full/listas-enlazadas-en-archivos-55a237d477f70 7/13
6
En un archivo se pueden tener varias Listas:
Que ordenan por Nombre
Que ordenan por Apellido
Que ordenan Descendentemente
Ejemplo:
Ejemplo de implementación de archivos con listas enlazadas:
5/12/2018 LISTAS ENLAZADAS EN ARCHIVOS - slidepdf.com
http://slidepdf.com/reader/full/listas-enlazadas-en-archivos-55a237d477f70 8/13
7
Implementación en lenguaje C++:
#include <cstdlib>
#include <iostream>
#include <io.h>
#include <fcntl.h>
#include <sys\stat.h>
using namespace std;
struct encabezado{
int PR;
int NRS;
}e;
struct registro{
int NR;char nom[10];
int edad;int SR;
}r,a,s;
void escribir(){
system("cls");
char nomarch[10];
int fd,rpta=1,le,lr,x,band,pos;
le=sizeof(struct encabezado);
lr=sizeof(struct registro);
cout<<"Ingrese el nombre del archivo a crear (Ejm:archivo.txt): ";
gets(nomarch);
if((fd=creat(nomarch,S_IWRITE|S_IREAD))<0){cout<<"El archivo no se puede crear";
return;
}
lseek(fd,le,0);
e.PR=-1;
e.NRS=0;
while(rpta==1){
fflush(stdin);
r.NR=++e.NRS;
cout<<"Ingrese el nombre:";
gets(r.nom);cout<<"ingrese la edad:";
cin>>r.edad;
if(e.PR==-1){
r.SR=e.PR;
e.PR=r.NR;
}
else{
x=e.PR;
5/12/2018 LISTAS ENLAZADAS EN ARCHIVOS - slidepdf.com
http://slidepdf.com/reader/full/listas-enlazadas-en-archivos-55a237d477f70 9/13
8
band=0;//band=0 sifnifica que se debe actualizar
//el encabezadowhile(x!=-1){
fflush(stdin);
pos=(x-1)*lr+le;
lseek(fd,pos,0);
read(fd,&s,lr);if((strcmp(r.nom,s.nom))>0){
band=1;
a=s;
}
elsebreak;
x=s.SR;
}
if(band==0){
r.SR=e.PR;
e.PR=r.NR;
}if(band==1){
r.SR=a.SR;
a.SR=r.NR;
pos=(a.NR-1)*lr+le;
lseek(fd,pos,0);
write(fd,&a,lr);
}
}
pos=(r.NR-1)*lr+le;
lseek(fd,pos,0);
write(fd,&r,lr);
cout<<"Desea seguir llenando registros?? si=1/no=0: ";cin>>rpta;
}
lseek(fd,0,0);
write(fd,&e,le);
close(fd);
fflush(stdin);
system("PAUSE");
}
void leer(){
system("cls");
int le,lr,x,fd,pos;char nomarch[10];
le=sizeof(struct encabezado);
lr=sizeof(struct registro);cout<<"Ingrese el nombre del archivo que desea abrir (Ejm:archivo.txt): ";
gets(nomarch);
if((fd=open(nomarch,O_TEXT))<0){
cout<<"El archivo no se puede crear";
return;
5/12/2018 LISTAS ENLAZADAS EN ARCHIVOS - slidepdf.com
http://slidepdf.com/reader/full/listas-enlazadas-en-archivos-55a237d477f70 10/13
9
}
read(fd,&e,le);x=e.PR; //x irá valiendo el valor de cada puntero
while(x!=-1){
fflush(stdin);
pos=(x-1)*lr+le;
lseek(fd,pos,0);read(fd,&r,lr);
cout<<r.nom<<" "<<r.edad<<" "<<endl;
x=r.SR;
}
close(fd);fflush(stdin);
system("PAUSE");
}
void agregar(){
system("cls");
char nomarch[10];int fd,pos,lr,le,x,band;
lr=sizeof(struct registro);
le=sizeof(struct encabezado);
cout<<"Ingrese el nombre del archivo que desea abrir (Ejm: archivo.txt): ";
gets(nomarch);
if((fd=open(nomarch,O_RDWR))<0){
cout<<"El archivo no se puede crear";
return;
}
fflush(stdin);
r.NR=++e.NRS;
cout<<"Ingrese el nombre: ";gets(r.nom);
cout<<"Ingrese la edad: ";
cin>>r.edad;
x=e.PR;
band=0;
while(x!=-1){
fflush(stdin);
pos=(x-1)*lr+le;
lseek(fd,pos,0);
read(fd,&s,lr);
if((strcmp(r.nom,s.nom))>0){
band=1;a=s;
}
elsebreak;
x=s.SR;
}
if(band==0){
r.SR=e.PR;
5/12/2018 LISTAS ENLAZADAS EN ARCHIVOS - slidepdf.com
http://slidepdf.com/reader/full/listas-enlazadas-en-archivos-55a237d477f70 11/13
10
e.PR=r.NR;
}if(band==1){
r.SR=a.SR;
a.SR=r.NR;
pos=(a.NR-1)*lr+le;
lseek(fd,pos,0);write(fd,&a,lr);
}
pos=(r.NR-1)*lr+le;
lseek(fd,pos,0);write(fd,&r,lr);
lseek(fd,0,0);
write(fd,&e,le);
close(fd);
system("PAUSE");
}
void eliminar (){
system("cls");
char nom[10],nomarch[10];
int fd,pos,lr,le,x;
lr=sizeof(struct registro);
le=sizeof(struct encabezado);
cout<<"Ingrese el nombre del archivo actualizar (Ejm:archivo.txt): ";
gets(nomarch);
if((fd=open(nomarch,O_RDWR))<0){
cout<<"El archivo no se puede crear";
return;
}cout<<" Ingrese el nombre del registro a eliminar : ";
gets(nom);
read(fd,&e,le);
x=e.PR;
while(x!=-1){
pos=(x-1)*lr+le;
lseek(fd,pos,0);
read(fd,&r,lr);
if((strcmp(r.nom,nom))==0){
if(r.NR==e.PR){
e.PR=r.SR;
lseek(fd,0,0);write(fd,&e,le);
}
else{a.SR=r.SR;
pos=(a.NR-1)*lr+le;
lseek(fd,pos,0);
write(fd,&a,lr);
break;
5/12/2018 LISTAS ENLAZADAS EN ARCHIVOS - slidepdf.com
http://slidepdf.com/reader/full/listas-enlazadas-en-archivos-55a237d477f70 12/13
11
}
}a=r;
x=r.SR;
}
close(fd);
system("PAUSE");}
void actualizar(){
system("cls");
int le,lr,x,fd,pos;char nomarch[10],nom[10];
le=sizeof(struct encabezado);
lr=sizeof(struct registro);
cout<<"Ingrese el nombre del archivo actualizar (Ejm:archivo.txt): ";
gets(nomarch);
if((fd=open(nomarch,O_RDWR))<0){
cout<<"El archivo no se puede crear";return;
}
cout<<"Ingrese el nombre:";
gets(nom);
read(fd,&e,le);
x=e.PR;
while(x!=-1){
fflush(stdin);
if((strcmp(r.nom,nom))==0){
cout<<"ingrese la edad: ";
cin>>r.edad;
pos=(r.NR-1)*lr+le;lseek(fd,pos,0);
write(fd,&r,lr);
}
x=r.SR;
}
close(fd);
system("PAUSE");
}
int menu_principal(){
int op;
system("cls");cout<<"::PROGRAMA DE MANIPULACION DE ARCHIVOS::"<<endl<<endl;
cout<<"[1] Ingreso de datos"<<endl;
cout<<"[2] Leer Datos"<<endl;cout<<"[3] Agregar Datos"<<endl;
cout<<"[4] Eliminar por Nombre"<<endl;
cout<<"[5] Actualizar"<<endl;
cout<<"[6] Salir"<<endl<<endl;
cout<<"Ingrese el numero de la opcion a ejecutar: ";
5/12/2018 LISTAS ENLAZADAS EN ARCHIVOS - slidepdf.com
http://slidepdf.com/reader/full/listas-enlazadas-en-archivos-55a237d477f70 13/13
12
cin>>op;
fflush(stdin);return op;
}
int main(int argc, char *argv[]){
int op=0;system("cls");
do{
op=menu_principal();
switch(op){
case 1:{escribir();}
break;
case 2:
{leer();}
break;
case 3:
{agregar();}break;
case 4:
{eliminar();}
break;
case 5:
{actualizar();}
break;
case 6:
{cout<<"Programa finalizado"<<endl;}
break;
default:{};break;
}}
while (op!=6);
system("PAUSE");
return EXIT_SUCCESS;
}