Professional Documents
Culture Documents
TP N1
Listas Enlazadas
ndice de contenido
1) Consigna del trabajo prctico: .................................................................................................................. 2
2) Datos, metodologa y resultados. ............................................................................................................. 4
3) Programa codificado en lenguaje C.......................................................................................................... 7
4) Salidas en pantalla del programa. ......................................................................................................... 14
5) Ideas adicionales: ..................................................................................................................................... 18
Stroili-Mario-Lambri
Informtica II
Pgina 1
Situacin problemtica:
Se desea crear un programa que almacene informacin de los sitios visitados por los clientes de una
empresa. Los datos que se registran de cada sitio son:
Stroili-Mario-Lambri
Informtica II
Pgina 2
Stroili-Mario-Lambri
Informtica II
Pgina 3
Un archivo (datos.txt) que contiene el n de IP, URL, cantidad de visitas y la fecha de paginas
web que se cargaran en la lista enlazada para su posterior muestra, ordenamiento y
almacenamiento en un archivo de salida nuevo.txt.
Un archivo (prueba.txt) que contiene el n de IP, URL y fecha de pginas web que se utilizaran
para simular la visita de sitios.
La forma de ingreso de nodos a la lista: una lista tipo cola (FIFO:First-In-First-Out).
La forma de ordenamiento de la lista, un ordenamiento compuesto, primero por visitas en
decreciente y a partir de all ordenar en forma decreciente por el campo fecha.
Metodologa:
Siguiendo la consigna del trabajo practico, se pens al programa creado mediante un diagrama de
bloques, para idealizar el flujo de la informacin que maneja el programa.
Utilizamos diferentes funciones para realizar cada una de las opciones del men:
char men (): Muestra el men con las opciones disponibles y se le pide al usuario que ingrese
una opcin valida. Esta funcin devuelve la opcin al main.
nodo *carga (nodo*p): Con los datos que se encuentran en el archivo datos.txt, esta funcin
carga la lista aadiendo los nodos al principio de la lista. Devuelve al main, el puntero al inicio de
la lista cargada.
nodo *ordena (nodo*p): Esta funcin recibe como parmetro el puntero al inicio de la lista
cargada y la ordena: primero por visitas en forma decreciente y si las visitas son iguales, ordena
en forma decreciente por fecha. Devuelve al main el puntero al inicio de la lista ordenada.
void mostrar (nodo*p): Recibe como parmetro el puntero al inicio de la lista ordenada y la
muestra en pantalla.
void simula (nodo*p): Recibe como parmetro el puntero al inicio de la lista cargada y con los
datos que se encuentran en el archivo prueba.txt. Mientras no se encuentre el EOF de prueba.txt,
lee los datos de cada lnea y compara por el campo IP. Cuando una IP leda sea igual a una IP
presente en la lista, incrementa las visitas y actualiza la fecha de ese nodo.
nodo *new1 (nodo*p): Recibe como parmetro el puntero al inicio de la lista cargada. Pide al
usuario que ingrese por teclado los campos: IP, URL y fecha del nuevo sitio visitado. Devuelve al
main el puntero al inicio de la lista con el nuevo nodo aadido al final de la misma.
nodo *borra (nodo*p): Recibe como parmetro el puntero al inicio de la lista ordenada y
elimina el ultimo nodo (el mas antiguo y menos visitado). Devuelve al main un puntero al inicio
de la lista actualizada.
void guardar (nodo*p): Luego de las modificaciones realizadas a la lista, recibe como
parmetro el puntero al inicio de la misma y creando un archivo nuevo.txt, guarda la lista
ordenada y actualizada en este.
El siguiente diagrama de bloques indica la relacin entre programa principal, men y funciones,
marcando el tipo de dato y la variable con la cual se invoca a la funcin.
Stroili-Mario-Lambri
Informtica II
Pgina 4
Stroili-Mario-Lambri
Informtica II
Pgina 5
Resultados:
Stroili-Mario-Lambri
Informtica II
Pgina 6
#include<stdio.h>
#include<stdlib.h>
typedef struct {
int a,m,d;
}fecha;
typedef struct sitio {
int ip[4];
char url[128];
int visitas;
fecha f;
struct sitio *sig;
}nodo;
int main()
{
char menu(),opcion;
nodo *p=NULL; //p es el puntero de inicio de la lista, se crea la lista
void mostrar(nodo*p);
void simula(nodo*p);
void guardar(nodo*p);
nodo *ordena(nodo*p);
nodo *carga(nodo*p);
nodo *new1(nodo*p);
nodo *borra(nodo*p);
p=carga(p); //Carga la lista
opcion=menu();
while (opcion!='5')
{ switch (opcion) {
case ('1'): {p=ordena(p);
mostrar(p);};break;
case ('2'): {simula(p);};break;
case ('3'): {p=borra(p);};break;
case ('4'): {p=new1(p);
mostrar(p);};break;
}
guardar(p);
printf("Esperando respuesta...\n");
scanf("%c",&opcion);
}
printf("\n\nARCHIVO nuevo.txt CREADO!");
getch();
return(0);
} //Fin del programa principal
Stroili-Mario-Lambri
Informtica II
Pgina 7
Stroili-Mario-Lambri
Informtica II
Pgina 8
Informtica II
Pgina 9
}
}
if(free==p) //Elimina el nodo a insertar en la nueva lista
{
p=p->sig;
}
else
{
aux->sig=free->sig;
}
if(nueva==NULL) //Inserta el nodo en la nueva lista
{
nueva=free;
}
else
{d=nueva;
while(d->sig!=NULL)
{
d=d->sig;
}
d->sig=free;
free->sig=NULL;
}
t=p;
}
}
p=nueva; //Reemplaza la lista por la lista nueva ordenada por ambos campos
return(p);
}
//Declaracin de la funcin mostrar
void mostrar(nodo *p) //OK
{
nodo *t;
int i=0;
printf("--------------------------IP|||URL|||VISITAS|||A/M/D--------------------------\n");
t=p;
while(t->sig!=NULL)
{
printf("%d.%d.%d.%d ||| %s ||| %d ||| %d/%d/%d\n",t->ip[0],t->ip[1],t->ip[2],t->ip[3],t->url,t>visitas,t->f.a,t->f.m,t->f.d);
t=t->sig;
i++;
}
printf("\n\nCantidad de registros: %d\n",i);
}
Stroili-Mario-Lambri
Informtica II
Pgina 10
Informtica II
Pgina 11
for(i=0;i<4;i++)
{
printf("\nIP(%d):",i+1);
scanf("%d",&nuev->ip[i]);
}
printf("\nURL:");
scanf("%s",nuev->url);
nuev->visitas=1;
printf("\nAAAA de visita:");
scanf("%d",&nuev->f.a);
printf("\nMM de visita:");
scanf("%d",&nuev->f.m);
printf("\nDD de visita:");
scanf("%d",&nuev->f.d);
t=p;
while(t->sig!=NULL)
{
t=t->sig;
}
t->sig=nuev; //El nuevo nodo se inserta al final de la lista
nuev->sig=NULL;
return(p);
}
//Declaracion de la funcion borra
nodo *borra(nodo*p) //OK//
{
nodo *t,*ant;
ant=p;
t=p;
if(t==NULL)
{
return(p);
}
else
{
while(t->sig!=NULL) //Busca el ultimo nodo de la lista
{
ant=t;
t=t->sig;
}
ant->sig=NULL; //Borra el ultimo nodo
free(t); //Libera el espacio de memoria que ocupaba el ultimo nodo
p=ordena(p);
}
}
Stroili-Mario-Lambri
Informtica II
Pgina 12
Stroili-Mario-Lambri
Informtica II
Pgina 13
Opcin 1:
Stroili-Mario-Lambri
Informtica II
Pgina 14
Stroili-Mario-Lambri
Informtica II
Pgina 15
Opcin 4:
Stroili-Mario-Lambri
Informtica II
Pgina 16
Opcin 5:
Stroili-Mario-Lambri
Informtica II
Pgina 17
5) Ideas adicionales:
Durante la realizacin de este trabajo practico se plantearon diversas ideas para la metodologa de
ordenamiento, es decir, de la funcin nodo *ordena (nodo *p).
Una de estas ideas nos resulto interesante, pero no la utilizamos debido a que no logramos que
devuelva los resultados esperados, pero que seguramente corrigiendo algn error de programacin
puede ser interesante. La funcin ordena presente en el cdigo fuente del programa funciona de manera
correcta, devolviendo los resultados esperados, esto es solo una versin alternativa de dicha funcin.
Dejamos constancia de esto, adjuntando el cdigo de la funcin alternativa de ordenamiento, que se
puede ver aqu abajo:
Versin alternativa a la funcin nodo *ordena(nodo*p)
nodo *ordena2(nodo *p)
{
nodo *t, *d, *ant, *aux, *free,*nueva;
int may;
char fre[15],te[15];
t=p;
if(t==NULL)
{
printf("La lista esta vacia");
return (p);
}
else
{nueva=NULL;
while(t!=NULL)
{free=t;
may=t->visitas;
sprintf(fre,"%d%d%d",free->f.a,free->f.m,free->f.d); //Guarda en la cadena los tres enteros de la
fecha//*Ver al final
while(t->sig!=NULL) //El metodo comienza por ordenar la lista por el campo "visitas"//
{ant=t;
t=t->sig;
sprintf(te,"%d%d%d",t->f.a,t->f.m,t->f.d);
if(may<=t->visitas)
{
if(may<t->visitas)
{free=t;
may=t->visitas;
aux=ant;
}
else //Si las visitas son iguales, ordena por fecha//
{
if(strcmp(fre,te)<=0) //Es decir, si fre<te
{ if(strcmp(fre,te)<0)
{free=t;
may=t->visitas;
aux=ant;
strcpy(fre,te);
}
}
Stroili-Mario-Lambri
Informtica II
Pgina 18
}
}
}
if(free==p) //Elimina el nodo a insertar en la nueva lista
{
p=p->sig;
}
else
{
aux->sig=free->sig;
}
if(nueva==NULL) //Inserta el nodo en la nueva lista
{
nueva=free;
}
else
{d=nueva;
while(d->sig!=NULL)
{
d=d->sig;
}
d->sig=free;
free->sig=NULL;
}
t=p;
}
}
p=nueva; //Reemplaza la lista por la lista nueva ordenada por ambos campos
return(p);
}
Nota: la llamada a la funcin ordena2 es igual a la llamada de la funcin ordena usada en el programa
principal.
*Para mas informacin sobre la funcin sprintf presente en la biblioteca estndar stdio de ANSI C,
visitar el sitio http://c.conclase.net/librerias/?ansifun=sprintf
Stroili-Mario-Lambri
Informtica II
Pgina 19