Sunteți pe pagina 1din 15

PROGRAMA NACIONAL DE FORMACIN EN

INFORMATICA (PNFI)

ALGORITMICA Y PROGRAMACION

Algortmica y Programacin

Unidad 12. Listas Elazadas

Ing. Sullin Santaella

UNIDAD CURRICULAR: ALGORITMICA Y PROGRAMACION


Ejercicios Listas Enlazadas

1. Ejercicios Resueltos de Listas Enlazadas

1. Dada la siguiente declaracin de lista:


struct Tlista *Artculo;
struct Articulo { int Codigo,Cont_Pedida;
TLista *Sig; }
Se tiene una lista en la que se han introducido pedidos segn el orden de llegada,
por lo que puede haber pedidos del mismo artculo. Se pide escribir una funcin
que, dada una lista como la anteriormente descrita, devuelva un nico elemento
por cada artculo, en el cual el campo Cant_Pedida tenga la suma de todas las
cantidades pedidas de ese artculo. No se pueden utilizar estructuras auxiliares,
as como tampoco estructuradas de control como while, for o do/while.
void Elimina(Tlista *L; int Cod; int *Suma);
{ Tlista Aux;
if L !Null
if L->Codigo ==Cod
{ Aux = L;
Suma = Suma + L->Cant_Pedida;
L = L->Sig;
Free(Aux);
Elimina(L, Cod, Suma); }
else Elimina(L->Sig, Cod, Suma); }
void Eli_Codigo(Tlista *Lista);
{ if Lista !=Null
{ Elimina(Lista->Sig, Lista->Codigo, Lista->Cant_Pedida);
Eli_Codigo(Lista->Sig); } }

Algortmica y Programacin

Unidad 12. Listas Elazadas

Ing. Sullin Santaella

2. Lista Simplemente Enlazada


#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
Using namespace std;
struct dato {
int i;
dato *s;
}*a, *i, *p, *e;
int da;
int buscar(int d);
void insertar(int dat);
void mostrar(void);
void borrar(void);
void menu(void);
void guardar(void);
void cargar(void);
main()
{
menu();
}
void menu(void)
{
int opc,da;
do
{
cout<<"1 - Buscar datos";
cout<<"\t2 - Insertar datos";
cout<<"\t3 - Mostrar todos los datos";
cout<<"\t4 - Borrar un dato";
cout<<"\t5 - Guardar datos a Archivo";
cout<<"\t6 - Cargar datos de Archivo";
cout<<"\t0 - Finalizar";
cout<<"\nSeleccione opcion: ";
cin>>opc;
switch(opc)
{
case 0: cout<<"\n\nFinaliza el programa";
getch();
Algortmica y Programacin

Unidad 12. Listas Elazadas

Ing. Sullin Santaella

// usar delete para eliminar toda la lista


p=i;
while(p)
{
a=p;
p=p->s;
delete(a);
}
exit(0);
case 1: cout<<"\n\nIngrese dato a buscar: ";
cin>>da;
if(buscar(da))
cout<<"\n\nDato existe";
else
cout<<"\n\nDato NO EXISTE";
getch();
break;
case 2: cout<<"Ingrese dato: ";
cin>>da;
insertar(da);
break;
case 3: mostrar();
break;
case 4: borrar();
break;
case 5: guardar();
break;
case 6: cargar();
break;
default: cout<<"\n\nOPCION NO VALIDA!!!";
getch();
}
}while(opc);
}
void mostrar(void)
{
int cont=1;
if(!i)
{
cout<<"\n\nNO HAY LISTA PARA MOSTRAR";
getch();
return;
}
p=i;
cout<<endl<<endl;
Algortmica y Programacin

Unidad 12. Listas Elazadas

Ing. Sullin Santaella

while(p)
{
cout<<cont++<<" - Valor = "<<p->i<<endl;
p=p->s;
}
cout<<"\n\nEso es todo";
getch();
}
int buscar(int d)
{
if (!i)
{
cout<<"No hay datos en la lista!!!";
getch();
return(0);
}
p=i;
a=NULL;
while(p->s && p->i<d)
{
a=p;
p=p->s;
}
return(p->i==d?1:0);
}
void insertar(int dat)
{
if(!i)
{
i=new(dato);
i->s=NULL;
i->i=dat;
return;
}
if(buscar(dat))
{
cout<<"\n\nDato existente";
getch();
return;
}
e=new(dato);
e->i=dat;
if(p==i && p->s)
{
Algortmica y Programacin

Unidad 12. Listas Elazadas

Ing. Sullin Santaella

e->s=p;
i=e;
return;
}
if(p==i && !p->s)
{
if(p->i < e->i)
{
p->s=e;
e->s=NULL;
}
else
{
e->s=p;
i=e;
}
return;
}
if(p->s)
{
a->s=e;
e->s=p;
return;
}
if(e->i > p->i)
{
e->s=NULL;
p->s=e;
}
else
{
a->s=e;
e->s=p;
}
}
void borrar(void)
{
cout<<"\n\nIngrese dato a eliminar: ";
cin>>da;
if(buscar(da))
{
if(a)
a->s=p->s;
else
i=p->s;
Algortmica y Programacin

Unidad 12. Listas Elazadas

Ing. Sullin Santaella

delete(p);
cout<<"\n\nDato eliminado";
}
else
cout<<"\n\nDato no se encuentra";
getch();
}
void guardar(void)
{
FILE *arch;
arch=fopen("DATOS-A.TXT","w");
if(!i)
{
cout<<"\n\nNO HAY LISTA PARA GUARDAR";
getch();
return;
}
p=i;
while(p)
{
fprintf(arch,"%i\n",p->i);
p=p->s;
}
cout<<"\n\nArchivo Guardado";
fclose(arch);
getch();
}
void cargar(void)
{
int c,x;
FILE *arch;
arch=fopen("DATOS-A.TXT","r");
if(!arch)
{
cout<<"\n\nNO EXISTE EL ARCHIVO";
getch();
return;
}
do
{
c=fscanf(arch,"%i\n",&x);
if(c!=EOF)
{
Algortmica y Programacin

Unidad 12. Listas Elazadas

Ing. Sullin Santaella

insertar(x);
}
}
while (c!=EOF);
cout<<"\n\nArchivo Cargado";
fclose(arch);
getch();
}
3. Lista Doblemente Enlazada
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
struct direc
{
char nombre[30];
char calle[40];
char ciudad[20];
char estado[3];
char codigo[10];
struct direc *sig; //puntero a la siguiente entrada
struct direc *ante; //puntero al registro anterior
}entrada_lista;
struct direc *ppio; //puntero a la primera entrada de la lista
struct direc *final; //puntero a la ltima entrada de la lista
struct direc *buscar(char *); //puntero a una funcion
void intro(void),buscar(void),guardar(void);
void cargar(void),listar(void);
void borrar(struct direc **,struct direc **);
void dl_insert(struct direc *i,struct direc **ppio, struct direc **final);
void leecad(char *,char *,int),mostrar(struct direc *);
int menu (void);
main()
{
ppio=final=NULL; //inicializar los punteros
for(;;)
{
switch (menu())
{
case 1:intro();
Algortmica y Programacin

Unidad 12. Listas Elazadas

Ing. Sullin Santaella

break;
case 2:borrar(&ppio,&final);
break;
case 3:listar();
getch();
break;
case 4:buscar(); //encuentra un nombre
getch();
break;
case 5:guardar(); //guarda la lista en un disco
break;
case 6:cargar(); //lee del disco
break;
case 7:exit(0); //fin de programa
}
}
}
//seleccionar una operacin
int menu(void)
{
char s[80];
int c;
printf("\n1. introducir un nombre\n");
printf("2. borrar un nombre\n");
printf("3. listar el archivo\n");
printf("4. buscar\n");
printf("5. guardar el archivo\n");
printf("6. cargar el archivo\n");
printf("7. salir\n");
do
{
printf("\nintroduzca su opcion: ");
gets(s);
c=atoi(s);
}
while(c<0 || c>7);
return(c);
}
//introducir nombres y direcciones
void intro(void)
{
struct direc *info;
for (;;)
{
Algortmica y Programacin

Unidad 12. Listas Elazadas

Ing. Sullin Santaella

info=(struct direc *)malloc (sizeof(entrada_lista)); //new(entrada_lista)


if (!info)
{
printf("\nno hay memoria");
return;
}
leecad("introduzca nombre: ",info->nombre,30);
if (!info->nombre[0])break; //terminar
leecad("introduzca calle: ",info->calle,40);
leecad("introduzca ciudad: ",info->ciudad,20);
leecad("introduzca provincia: ",info->estado,3);
leecad("introduzca codigo: ",info->codigo,10);
dl_insert(info,&ppio,&final);
} //bucle de entrada
}
//esta funcin lee una cadena de longitud mxima cont.
//previene el desbordamiento de la cadena y visualiza un mensaje indicativo
void leecad(char *indic,char *s,int cont)
{
char p[255];
do
{
printf(indic);
gets(p);
if (strlen(p)>cont)
{
printf("\ndemasiado largo\n");
printf("La longitud permitida es %i\n",cont);
}
}while(strlen(p)>cont);
strcpy(s,p);
}
//crea una lista doblemente enlazada ordenadamente
void dl_insert(
struct direc *i, //nuevo elemento
struct direc **ppio, //primer elemento de la lista
struct direc **final //ultimo elemento de la lista
)
{
struct direc *ant,*p;
if (*final==NULL) //primer elemento de la lista
{
Algortmica y Programacin

Unidad 12. Listas Elazadas

Ing. Sullin Santaella

i->sig=NULL;
i->ante=NULL;
*final=i;
*ppio=i;
return;
}
p=*ppio; //principio de la lista
ant=NULL;
while (p)
{
if(strcmp(p->nombre,i->nombre)<=0)
{
ant=p;
p=p->sig;
}
else
{
if(p->ante)
{
p->ante=i;
i->sig=p;
i->ante=ant; //p->ante;
ant->sig=i; //p->ante=i;
return;
}
i->sig=p; //nuevo primer elemento
i->ante=NULL;
p->ante=i;
*ppio=i;
return;
}
}
ant->sig=i; //ponerlo en el final
i->sig=NULL;
i->ante=ant;
*final=i;
}
//elimina un elemento de la lista
void borrar(struct direc **ppio, struct direc **final)
{
struct direc *info, *buscar(char *nombre);
char s[80];
printf("introduzca nombre: ");
Algortmica y Programacin

Unidad 12. Listas Elazadas

Ing. Sullin Santaella

gets(s);
info=buscar(s);
if(info)
{
if(*ppio==info)
{
*ppio=info->sig;
if (*ppio)
(*ppio)->ante=NULL;
else
*final=NULL;
}
else
{
info->ante->sig=info->sig;
if (info!=*final)
info->sig->ante= info->ante;
else
*final=info->ante;
}
free(info); //devolver memoria al sistema
}
}
//buscar una direccion
struct direc *buscar(char *nombre)
{
struct direc *info;
info=ppio;
while(info)
{
if(!strcmp(nombre,info->nombre))
return info;
info=info->sig; //obtener siguiente direccion
}
printf("nombre no encontrado\n");
return NULL; //no encontrado
}
//mostrar la lista entera
void listar(void)
{
struct direc *info;
info=ppio;
if (!info)
Algortmica y Programacin

Unidad 12. Listas Elazadas

Ing. Sullin Santaella

{
printf("\n Lista Vaca\n");
return;
}
while(info)
{
mostrar(info);
info=info->sig; //obtener siguiente direccion
}
printf("\n Fin de Lista\n");
}
//esta funcion imprime realmente los campos de cada direccion
void mostrar(struct direc *info)
{
printf("%s ",info->nombre);
printf("%s ",info->calle);
printf("%s ",info->ciudad);
printf("%s ",info->estado);
printf("%s \n",info->codigo);
}
//buscar un nombre en la lista
void buscar(void)
{
char nombre[40];
struct direc *info, *buscar(char *nombre);
printf("introduzca nombre: ");
gets(nombre);
info=buscar(nombre);
if (!info)
printf("no encontrado\n");
else
mostrar(info);
}
//guardar el archivo en disco
void guardar(void)
{
struct direc *info;
FILE *fp;
fp=fopen("listac","wb");
if (!fp)
{
Algortmica y Programacin

Unidad 12. Listas Elazadas

Ing. Sullin Santaella

printf("no se puede abrir el archivo\n");


exit(1);
}
printf("\nguardando el archivo");
info=ppio;
while(info)
{
fwrite(info,sizeof(struct direc),1,fp);
info=info->sig; //obtiene la siguiente direccion
}
fclose(fp);
}
//cargar el archivo de direcciones
void cargar()
{
struct direc *info;
FILE *fp;
fp=fopen("listac","rb");
if (!fp)
{
printf("no se puede abrir el archivo\n");
exit(1);
}
//liberar cualquier memoria previamente dispuesta
while (ppio)
{
info=ppio->sig;
free(info);
ppio=info;
}
//reinicializar los punteros
ppio=final=NULL;
printf("\ncargando el archivo\n");
while(!feof(fp))
{
info=(struct direc *)malloc(sizeof(struct direc));
if (!info)
{
printf("no hay memoria");
return;
}
if (1!=fread(info, sizeof(struct direc), 1,fp)) break;
Algortmica y Programacin

Unidad 12. Listas Elazadas

Ing. Sullin Santaella

dl_insert(info,&ppio,&final);
}
fclose(fp);
}

Algortmica y Programacin

Unidad 12. Listas Elazadas

Ing. Sullin Santaella

S-ar putea să vă placă și