listas enlazadas en archivos

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

Upload: luis-principe-orbegozo

Post on 12-Jul-2015

1.081 views

Category:

Documents


0 download

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

}

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;

}