Listas enlazadas en Lenguaje C

download Listas enlazadas en Lenguaje C

of 20

Transcript of Listas enlazadas en Lenguaje C

  • 7/21/2019 Listas enlazadas en Lenguaje C

    1/20

    INFORMTICA II INGENIERIA ELCTRICA

    TP N1

    Listas Enlazadas

    Alumnos: Nicols Stroili, Facundo Mario y Fernando Lambri.

    Profesores: Laura Angelone y Alfonso Pons.

    Comisin: 560

    Ao: 2013

  • 7/21/2019 Listas enlazadas en Lenguaje C

    2/20

    Stroili-Mario-Lambri Informtica II Pgina 1

    ndice de contenido1)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

  • 7/21/2019 Listas enlazadas en Lenguaje C

    3/20

    Stroili-Mario-Lambri Informtica II Pgina 2

    1) Consigna del trabajo prctico:

    Introduccin

    Proxy/Cach

    En que consiste el servicio Proxy/Cache?

    Consiste, bsicamente, en almacenar los objetos de Internet solicitados por clientes web, a travs de

    protocolos como HTTP y FTP, en un sistema ms cercano al cliente (el servidor proxy/cache), de forma

    que posteriores peticiones de los mismos objetos puedan ser atendidas directamente por este servidor,

    sin necesidad de traerlo en ese instante desde su origen en Internet, reduciendo el tiempo necesario

    para cargar la informacin y aumentando la velocidad de cargas de pginas y transferencias de ficheros.

    Otra utilidad es la obtencin de informacin para estadsticas de acceso a sitios y de seguridad.

    Cmo funciona?

    La idea de su funcionamiento es la siguiente:

    Quien va a buscar las pginas pedidas no es el cliente -el navegador- sino el propio servidor

    proxy/cach. Esto le da la posibilidad de mantener una cach (copia) de las pginas ms consultadas

    ltimamente. Por tanto, la segunda vez que el mismo u otro cliente o navegador le pida alguna de estas

    pginas, ya la tendr almacenada y no necesitar conectarse con el nodo remoto; la suministrar l

    mismo. El incremento de velocidad en la transferencia es importante.

    Por qu se usa y que ventajas tiene?

    Al acceder a la WWW a travs de una cach se obtiene un acceso ms rpido a los documentos en un

    gran porcentaje de los accesos. Una cach puede llega a dar porcentajes de acierto cercanos e incluso

    superiores al 50%. El porcentaje de aciertos viene dado por el nmero total de documentos que la cach

    puede servir sin realizar consultas al original frente al nmero total de accesos.

    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:

    Direccin IP:4 enteros comprendidos entre 0 y 255 c/u de ellos.URL: String de 128 caracteresVisitas: Cuenta las veces que fue visitada la URLFecha:Fecha en que se registr el ltimo acceso (Tres enteros: ao, mes y da)

    Cada vez que se visite un sitio, el mismo ser puesto en cola en la tabla del Proxy, en caso de no existir,pero si el sitio ya fue dado de alta, se debe incrementar el contador de visitas de dicho sitio y actualizar

    la fecha. Luego reordenar la tabla en orden decreciente por cantidad de visitas y decreciente por fechas.

    Cada vez que se desee dar de baja un sitio, se debe eliminar el sitio ms antiguo y menos visitado (el

    ltimo).

  • 7/21/2019 Listas enlazadas en Lenguaje C

    4/20

    Stroili-Mario-Lambri Informtica II Pgina 3

    Mostrar un men con las siguientes opciones:

    1- Mostrar

    2- Simular

    3- Borrar

    4- Nuevo5- Salir

    Al iniciar el programa se debe crear una lista y cargar en ella los datos del archivo DATOS.TXT1- Mostrar: debe mostrar por pantalla los datos de la lista2- Simular: debe simular la visita de sitios web. Para ello tomar los datos del archivo PRUEBA.TXT.3- Borrar: Elimina el sitio menos visitado y ms antiguo.4- Nuevo. Debe solicitar una IP ( Nueva ) y todos los datos para agregarla a la lista.5- Salir: Guarda la lista en un nuevo archivo (NUEVO.TXT).

  • 7/21/2019 Listas enlazadas en Lenguaje C

    5/20

    Stroili-Mario-Lambri Informtica II Pgina 4

    2) Datos, metodologa y resultados.

    Datos:

    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 yalmacenamiento en un archivo de salida nuevo.txt.

    Un archivo (prueba.txt) que contiene el n de IP, URLy 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 ingreseuna 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 funcincarga 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: primeropor visitas en forma decrecientey si las visitas son iguales, ordenaen forma decreciente por fecha. Devuelve al mainel puntero al inicio de la lista ordenada.

    void mostrar (nodo*p):Recibe como parmetro el puntero al inicio de la lista ordenada y lamuestra en pantalla.

    void simula (nodo*p):Recibe como parmetro el puntero al inicio de la lista cargada y con losdatos 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 alusuario que ingrese por teclado los campos: IP, URL y fecha del nuevo sitio visitado. Devuelve al

    mainel 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 mainun puntero al inicio

    de la lista actualizada.

    void guardar (nodo*p): Luego de las modificaciones realizadas a la lista, recibe comoparmetro 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.

  • 7/21/2019 Listas enlazadas en Lenguaje C

    6/20

    Stroili-Mario-Lambri Informtica II Pgina 5

  • 7/21/2019 Listas enlazadas en Lenguaje C

    7/20

    Stroili-Mario-Lambri Informtica II Pgina 6

    Resultados:

    Opcin 1:salida en pantalla de la lista cargada y ordenada.

    Opcin 2:salida en pantalla de la lista actualizada por visitas y fecha, y ordenada.

    Opcin 3:actualizacin de la lista, borrando el sitio ms antiguo y menos visitado.

    Opcin 4: actualizacin de la lista, aadiendo un nuevo sitio cuyos datos se ingresan porteclado.

    Opcin 5:creacin de un nuevo archivo llamado nuevo.txt, con la lista ordenada y actualizada.

  • 7/21/2019 Listas enlazadas en Lenguaje C

    8/20

    Stroili-Mario-Lambri Informtica II Pgina 7

    3) Programa codificado en lenguaje CEl siguiente algoritmo codificado en C, se realizo ntegramente en Windows 7, utilizando el softwareCode-Blocks v12.11.

    #include

    #include

    typedef struct {

    int a,m,d;

    }fecha;

    typedef struct sitio {int ip[4];

    char url[128];int visitas;

    fecha f;struct sitio *sig; //*Puntero al elemento siguiente de la lista*//

    }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

  • 7/21/2019 Listas enlazadas en Lenguaje C

    9/20

    Stroili-Mario-Lambri Informtica II Pgina 8

    //DECLARACION DE LAS FUNCIONES UTILIZADAS

    char menu ()//OK{

    char opcion;

    printf("*---------------------------------------------------------------------*\n");printf("|-----------------SIMULADOR DE SERVIDOR PROXY/CACHE-------------------|\n");printf("|---------------------------------------------------------------------|\n");

    printf("| F.C.E.I.A || U.N.R |\n");printf("|---------------------------------------------------------------------|\n");

    printf("| INFORMATICA II -- INGENIERIA ELECTRICA |\n");printf("|---------------------------------------------------------------------|\n");

    printf("|---------------------------------------------------------------------|\n");

    printf("*---------------------------------------------------------------------*\n\n\n");

    printf("************************* Menu de opciones *************************\n\n");

    printf("---->1-Mostrar\n");printf("---->2-Simular\n");

    printf("---->3-Borrar\n");printf("---->4-Nuevo\n");

    printf("---->5-Salir\n");

    scanf("%c",&opcion);

    return opcion;

    }

    //Declaracin de la funcin carganodo *carga(nodo*p)//OK

    { FILE *fp;int fin;

    nodo *nuevo,*t;

    fp=fopen("datos.txt","r");

    if(fp==NULL) {printf("No se puede acceder al archivo");}else {while(!feof(fp))

    {nuevo=(nodo*)malloc(sizeof(nodo));

    fscanf(fp,"%d %d %d %d %s %d %d %d %d",&nuevo->ip[0],&nuevo->ip[1],&nuevo->ip[2],&nuevo->ip[3],nuevo->url,&nuevo->visitas,&nuevo->f.a,&nuevo->f.m,&nuevo->f.d);

    nuevo->sig=p;

    p=nuevo;}

    }fclose(fp);

    return(p);

    }

  • 7/21/2019 Listas enlazadas en Lenguaje C

    10/20

    Stroili-Mario-Lambri Informtica II Pgina 9

    //Declaracin de la funcin ordena

    nodo *ordena (nodo*p) //OK

    {nodo *t, *d, *ant, *aux, *free,*nueva;

    int may;

    t=p;if(t==NULL)

    {printf("La lista esta vacia");

    return (p);}

    else

    {nueva=NULL;

    while(t!=NULL){t=p;free=t;

    may=t->visitas;

    while(t->sig!=NULL) //El mtodo comienza por ordenar la lista por el campo "visitas"//{ant=t;

    t=t->sig;

    if(mayvisitas)

    {if(mayvisitas)

    {free=t;

    may=t->visitas;

    aux=ant;

    }else //Si las visitas son iguales, ordena por fecha//

    {if(free->f.af.a){ if(free->f.af.a)

    {free=t;may=t->visitas;

    aux=ant;}

    else //Si el ao es igual, ordena por mes//{ if(free->f.mf.m)

    { if(free->f.mf.m){ free=t;

    may=t->visitas;aux=ant;

    }else//Si el mes es igual, ordena por dia//

    { if(free->f.df.d){ free=t;

    may=t->visitas;

    aux=ant;}

    }

    }

    }}

    }

  • 7/21/2019 Listas enlazadas en Lenguaje C

    11/20

    Stroili-Mario-Lambri Informtica II Pgina 10

    }

    }

    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);

    }

  • 7/21/2019 Listas enlazadas en Lenguaje C

    12/20

    Stroili-Mario-Lambri Informtica II Pgina 11

    //Declaracion de la funcion simular

    void simula(nodo *p) //En esta funcin no pudimos hallar el error por el cual el programa queda tildado

    { nodo *t;int ip[4];

    FILE *fp1;

    void mostrar(nodo*p);nodo *ordena(nodo*p);char url[128];

    fecha f1;

    t=p;printf("********************Simulacion de visita de sitios web********************\n");

    fp1=fopen("prueba.txt","r");

    if (fp1==NULL){printf("Error al abrir el archivo");}else {

    while (!feof(fp1)){

    fscanf(fp1,"%d\t%d\t %d\t %d\t %s\t%d\t %d\t%d\t",&ip[0],&ip[1],&ip[2],&ip[3],url,&f1.a,&f1.m,&f1.d);

    while (t->sig!=NULL && t->ip[0]!=ip[0] || t->ip[1]!=ip[1] || t->ip[2]!=ip[2] || t->ip[3]!=ip[3])

    {

    t=t->sig;

    }

    if (t->ip[0]==ip[0] && t->ip[1]==ip[1] && t->ip[2]==ip[2] && t->ip[3]==ip[3]) //Se actualiza la lista

    si las IP coinciden

    { t->visitas++;

    t->f.a=f1.a;t->f.m=f1.m;

    t->f.d=f1.d;}

    }

    p=ordena(p); //Devuelve la lista ordenada}

    fclose(fp1);

    mostrar(p);//Muestra la lista ordenada y actualizada

    return;}

    //Declaracion de la funcion new1

    nodo *new1(nodo*p)//OK//

    {

    nodo *nuev,*t;

    int i=0,ip[4];

    nuev=(nodo*)malloc(sizeof(nodo));

    printf("Ingrese la IP\n");

  • 7/21/2019 Listas enlazadas en Lenguaje C

    13/20

    Stroili-Mario-Lambri Informtica II Pgina 12

    for(i=0;iip[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 borranodo *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 nodofree(t); //Libera el espacio de memoria que ocupaba el ultimo nodo

    p=ordena(p);

    }

    }

  • 7/21/2019 Listas enlazadas en Lenguaje C

    14/20

    Stroili-Mario-Lambri Informtica II Pgina 13

    //Declaracion de la funcion guardar

    void guardar(nodo*p) //OK//{

    nodo *t;

    t=p;FILE *fp;

    fp=fopen ("nuevo.txt", "w");

    if(fp==NULL){

    printf("No se puede acceder al archivo");

    }

    else {while(t->sig!=NULL)

    {

    fprintf(fp,"%d.%d.%d.%d\t%s\t\t%d\t\t%d\t%d\t%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;}

    }

    fclose(fp);}

    Observacin: La funcin de simulacin de visitas de sitios web, no funciona correctamente. No pudimosencontrar el error que evita que se actualice la lista por visitas y fecha.

  • 7/21/2019 Listas enlazadas en Lenguaje C

    15/20

    Stroili-Mario-Lambri Informtica II Pgina 14

    4) Salidas en pantalla del programa.

    Men + Cartel:

    Opcin 1:

  • 7/21/2019 Listas enlazadas en Lenguaje C

    16/20

    Stroili-Mario-Lambri Informtica II Pgina 15

    Opcin 2: No realizamos captura de pantalla, porque el programa queda tildado.

    Opcin 3:

  • 7/21/2019 Listas enlazadas en Lenguaje C

    17/20

    Stroili-Mario-Lambri Informtica II Pgina 16

    Opcin 4:

  • 7/21/2019 Listas enlazadas en Lenguaje C

    18/20

    Stroili-Mario-Lambri Informtica II Pgina 17

    Opcin 5:

  • 7/21/2019 Listas enlazadas en Lenguaje C

    19/20

    Stroili-Mario-Lambri Informtica II Pgina 18

    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 maneracorrecta, 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;intmay;charfre[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 lafecha//*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(mayvisitas){

    if(mayvisitas){free=t;may=t->visitas;

    aux=ant;}

    else //Si las visitas son iguales, ordena por fecha//{

    if(strcmp(fre,te)

  • 7/21/2019 Listas enlazadas en Lenguaje C

    20/20

    Stroili-Mario-Lambri Informtica II Pgina 19

    }

    }

    }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 programaprincipal.

    *Para mas informacin sobre la funcin sprintfpresente en la biblioteca estndar stdiode ANSI C,visitar el sitiohttp://c.conclase.net/librerias/?ansifun=sprintf

    http://c.conclase.net/librerias/?ansifun=sprintfhttp://c.conclase.net/librerias/?ansifun=sprintfhttp://c.conclase.net/librerias/?ansifun=sprintfhttp://c.conclase.net/librerias/?ansifun=sprintf