Feed on
Posts
Comments
+ Archivos en C
+ Estructuras en C
+ Graficos en C
+ Metodo de ordenacion Burbuja
>> Punteros en C
    * Apuntadores en C
    * Aritmetica en C
    * Funciones en C
    * Estructuras en C
    >> Listas enlazadas en C

+ Tecnologias de almacenamiento
+ Turbo C basico 1

Listas enlazadas (Nodos)
  • Una lista es una colección de elementos llamados generalmente nodos. El orden entre los nodos se establece por medio de punteros, es decir, direcciones o referencias a otros nodos.
  • En general, un nodo consta de dos partes:
    • Un campo INFORMACION que será del tipo de datos que se quiera almacenar en una lista.
    • Un campo LIGA, de tipo puntero, que se utiliza para establecer la liga o el enlace con otro nodo de la lista. Si el nodo fuera el último de la lista, este campo tendrá como valor: NIL (vacío). Al emplearse el campo liga para relacionar dos nodos, no será necesario almacenar físicamente a los nodos en espacios contiguos.

      • Las operaciones que pueden llevarse a cabo en una lista son:
        • Recorrido de la lista.
        • Inserción de un elemento.
        • Borrado de un elemento.
        • Búsqueda de un elemento.

      Lista enlazada

    CREAFINAL(P)
    {Este algoritmo crea una lista, agregando cada nuevo nodo al FINAL de la misma. P y Q son variables de tipo puntero. P apuntará al inicio de la lista}
    1. CREA(P)
    2. Leer P^.INFORMACION
    3. Hacer P^.LIGA = NIL Y T = P
    4. Repetir
    CREA(Q)
    Leer Q^.INFORMACION
    Hacer Q^.LIGA = NIL, T^.LIGA = Q y T = Q
    5. Hasta (que ya no haya información)

    RECORRECURSIVO (P)
    {Este algoritmo recorre una lista recursivamente. P es el apuntador al nodo a visitar}
    1. Si P <> NIL entonces
    Escribir P^.INFORMACION
    Llamar a RECORRECURSIVO con P^.LIGA
    {Llamada recursiva con el apuntador al siguiente nodo de la lista}
    {Fin del condicional del paso 1}

    ELIMINAULTIMO(P)
    {Este algoritmo borra el último elemento de una lista. P es el apuntador al primer nodo de la lista}
    {Q y T son variables de tipo puntero}
    1. Si P^.LIGA = NIL entonces {Verifica si la lista tiene sólo un elemento}
    QUITA (P)
    Hacer P = NIL
    si no
    Hacer Q = P
    1.1 Repetir mientras (Q^.LIGA <> NIL)
    Hacer T = Q y Q = Q^.LIGA
    1.2 {Fin del condicional del paso 1.1}
    Hacer T^.LIGA = NIL
    QUITA (Q)
    2. {Fin del condicional del paso 1}

    Ejemplo 1
      #include<stdio.h>
      #include<conio.h>

      struct lista
      {
             char info[20];
             struct lista *liga;
      };

      struct lista *inicio, *final, *nuevo, *temporal

      contador = contador + 1;
      printf("Introduce un Nombre: ");
      scanf("%s",&datos);
      if (contador==1)
      {
             inicio=(struct lista*)malloc(sizeof(struct lista));
             strcpy(inicio->info,datos);
             inicio->liga=NULL;
             final=inicio;
      }

      if (contador>1)
      {
             temp3=inicio;
             while(temp3->liga!=NULL)
                    temp3=temp3->liga;
             temporal=(struct lista*)malloc(sizeof(struct lista));
             strcpy(temporal->info,datos);
             temporal->liga=NULL;
             temp3->liga=temporal;
      }

    Ejemplo 2
      // Programa que crea nodos al final de una lista y muestra
      // su contenido
      // Gerardo C rdenas - U de C

      #include <stdio.h>
      #include <conio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <
      struct lista //Declaracion de la estructura
      {
             char info[20];
             struct lista *liga;
      };

      struct lista *inicio, *temp1, *temp2;

      main()
      {
             char datos[20],k; //Variables locales
             int contador;
             contador = 0;
             clrscr();

             do
             {
                    printf("Escriba un nombre --> ");
                    gets(datos);
                    contador++;
                    if (contador==1) // Si el nodo es el primero
                    {
                           inicio = (struct lista*)malloc(sizeof(struct lista));
                           strcpy(inicio->info,datos);
                           inicio->liga = NULL;
             }
             else // Si ya existe al menos un nodo
                    {
                           temp1 = inicio;
                           while(temp1->liga!=NULL)
                                  temp1 = temp1->liga;
                           temp2 = (struct lista*)malloc(sizeof(struct lista));
                           strcpy(temp2->info,datos);
                           temp2->liga=NULL;
                           temp1->liga=temp2;
             }
                    printf("Otro nombre [S/N]?");
                    k=toupper(getch());
             } while (k!='N');

             printf("\n\nElementos de la lista\n");
             temp1 = inicio; // Mostrar el contenido de la lista
             while (temp1->liga!=NULL)
             {
                    printf(" %s ",temp1->info);
                    temp1 = temp1->liga;
             }
             printf("%s ",temp1->info); // Muestra el £ltimo elemento
             getch();
      }