Documente Academic
Documente Profesional
Documente Cultură
Junio 2014
Pre-requisitos
I. Introduccin
II. Definicin
III. Construccin del modelo de un elemento de la lista
IV. Operaciones sobre las listas enlazadas
A. Inicializacin
B. Insercin de un elemento en la lista
1. Insercin en una lista vaca
2. Insercin al inicio de la lista
3. Insercin al final de la lista
4. Insercin en otra parte de la lista
C. Eliminacin de un elemento de la lista
1. Eliminacin al inicio de la lista
2. Eliminacin en otra parte de la lista
D. Visualizacin de la lista
E. Destruccin de la lista
V. Ejemplo completo
lista.h
lista _function.h
lista.c
VI. Ver tambin
Pre-requisitos
Los tipos de datos Las estructuras El uso de typedef Los punteros Las funciones usuario
I. Introduccin
El objetivo de este artculo es el de comprender el uso de las listas enlazadas simples. Las listas
enlazadas pueden ser utilizadas cuando se necesitan hacer varias operaciones de insercin y
eliminacin de elementos.
II. Definicin
Las listas enlazadas son estructuras de datos semejantes a los array salvo que el acceso a un
elemento no se hace mediante un indice sino mediante un puntero. La asignacin de memoria
es hecha durante la ejecucin. En una lista los elementos son contiguos en lo que concierne al
enlazado.
En cambio, mientras que en un array los elementos estn contiguos en la memoria, en una lista
los elementos estn dispersos. El enlace entre los elementos se hace mediante un puntero. En
realidad, en la memoria la representacin es aleatoria en funcin del espacio asignado. El
puntero siguiente del ltimo elemento debe apuntar hacia NULL (el fin de la lista). Para acceder
a un elemento, la lista es recorrida comenzando por el inicio, el puntero siguiente permite el
desplazamiento hacia el prximo elemento. El desplazamiento se hace en una sola direccin,
del primer al ltimo elemento. Si deseas desplazarte en las dos direcciones (hacia delante y
hacia atrs) debers utilizar las [ listas doblemente enlazadas]
elemento, si no, no podr apuntar hacia el elemento. El puntero siguiente permitir el acceso al
prximo elemento.
typedef struct ElementoLista {
char
*dato;
struct ElementoLista *siguiente;
}Elemento;
Para tener el control de la lista es preferible guardar ciertos elementos: El primer elemento, el
ltimo elemento, el nmero de elementos. Para ello ser utilizado otra estructura (no es
obligatorio, pueden ser utilizadas variables)
typedef struct ListaIdentificar {
Elemento *inicio;
Elemento *fin;
int tamao;
}Lista;
El puntero inicio contendr la direccin del primer elemento de la lista. El puntero fin contendr
la direccin del ltimo elemento de la lista. La variable tamao contiene el nmero de
elementos. Cualquiera que sea la posicin en la lista, los punteros inicio y fin apuntan siempre
al primer y ltimo elemento. El campo tamao contendr el numero de elementos de la lista
cualquiera que sea la operacin efectuada sobre la lista.
A. Inicializacin
Modelo de la funcin:
void inicializacion (Lista *lista);
Esta operacin debe ser hecha antes de cualquier otra operacin sobre la lista. Esta inicializa el
puntero inicio y el puntero fin con el puntero NULL, y el tamao con el valor 0. La funcin
void inicializacion (Lista *lista){
lista->inicio = NULL;
lista->fin = NULL;
tamao = 0;
}
La funcin
La funcin
La funcin
La funcin
La funcin
/* eliminacin al inicio de la lista */
int sup_inicio (Lista * lista){
if (lista->tamao == 0)
return -1;
Element *sup_elemento;
sup_element = lista->inicio;
lista->inicio = lista->inicio->siguiente;
if (lista->tamao == 1)
lista->fin = NULL;
free (sup_elemento->dato);
free (sup_elemento);
lista->tamao--;
return 0;
}
Ejemplo de la funcin:
int sup_en_lista (Lista *lista, int pos);
La funcin devuelve -1 en caso de error, si no devuelve 0. Etapas:
el puntero sup_elem contendr la direccin hacia la que apunta el puntero siguiente del
elemento actual
el puntero siguiente del elemento actual apuntara hacia el elemento al que apunta el
puntero siguiente del elemento que sigue al elemento actual en la lista.
Si el elemento actual es el penltimo elemento, el puntero fin debe ser actualizado.
el tamao de la lista ser disminuido en un elemento
La funcin
D. Visualizacin de la lista
Para mostrar la lista entera hay que posicionarse al inicio de la lista (el puntero inicio lo
permitir). Luego utilizando el puntero siguiente de cada elemento la lista es recorrida del 1ero
al ultimo elemento. La condicin para detener es dada por el puntero siguiente del ultimo
elemento que vale NULL. La funcin
/* visualizacin de la lista */
void visualizacin (Lista * lista){
Element *actual;
actual = lista->inicio;
while (actual != NULL){
printf ("%p - %s\n", actual, actual->dato);
actual = actual->siguiente;
}
}
E. Destruccin de la lista
Para destruir la lista entera, he utilizado la eliminacin al inicio de la lista ya que el tamao es
mayor a cero. La funcin
/* destruir la lista */
void destruir (Lista * lista){
while (lista->tamao > 0)
sup_inicio (lista);
}
V. Ejemplo completo
lista.h
/* ---------- lista.h ----------- */
typedef struct ElementoLista
{
char *dato;
struct ElementoLista *siguiente;
} Elemento;
typedef struct ListaIdentificar
{
Elemento *inicio;
Elemento *fin;
int tamao;
} Lista;
/* inicializacin de la lista */
void inicializacin (Lista * lista);
/* INSERCION */
/* insercin en une lista vaca */
int ins_en_lista_vacia (Lista * lista, char *dato);
/* insercin al inicio de la lista */
int ins_inicio_lista (Lista * lista, char *dato);
/* insercin al final de la lista */
int ins_fin_lista (Lista * lista, Elemento * actual, char *dato);
/* insercin en otra parte */
int ins_lista (Lista * lista, char *dato, int pos);
/* SUPRESION */
lista _function.h
/***************************\
* lista_function.h *
\***************************/
void
inicialisacion (Lista * lista)
{
lista ->inicio = NULL;
lista ->fin = NULL;
lista ->tamao = 0;
}
/* insercion en une lista vacia */
int ins_en_lista _vacia (Lista * lista, char *dato){
Elemento *nuevo_elemento;
if ((nuevo_elemento = (Elemento *) malloc (sizeof (Elemento))) == NULL)
return -1;
if ((nuevo_elemento->dato = (char *) malloc (50 * sizeof (char)))
== NULL)
return -1;
strcpy (nuevo_elemento->dato, dato);
nuevo_elemento->siguiente = NULL;
lista ->inicio = nuevo_elemento;
lista ->fin = nuevo_elemento;
lista ->tamao++;
return 0;
}
/* insercin al inicio de la lista */
int ins_inicio_lista (Lista * lista, char *dato){
Elemento *nuevo_elemento;
if ((nuevo_elemento = (Elemento *) malloc (sizeof (Elemento))) == NULL)
return -1;
}
/* visualizacin de la Lista */
void muestra (Lista * lista){
Elemento *actual;
actual = lista ->inicio;
while (actual != NULL){
printf ("%p - %s\n", actual, actual->dato);
actual = actual->siguiente;
}
}
/* destruir la Lista */
void destruir (Lista * Lista){
while (lista ->tamao > 0)
sup_inicio (lista);
}
int menu (Lista *lista,int *k){
int eleccin;
printf("********** MENU **********\n");
if (lista ->tamao == 0){
printf ("1. Adicin del1er elemento\n");
printf ("2. Quitar\n");
}else if(lista ->tamao == 1 || *k == 1){
printf ("1. Adicin al inicio de la lista\n");
printf ("2. Adicin al final de la lista\n");
printf ("4. Supresin al inicio de la lista\n");
printf ("6. Destruir la lista\n");
printf ("7. Quitar\n");
}else {
printf ("1. Adicin al inicio de la lista\n");
printf ("2. Adicin al final de la lista\n");
printf ("3. Adicin despus de la posicin indicada\n");
printf ("4. Supresin al inicio de la lista\n");
printf ("5. Supresin despus de la posicin indicada\n");
printf ("6. Destruir la lista\n");
printf ("7. Quitar\n");
}
printf ("\n\nElegir: ");
scanf ("%d", &eleccin);
getchar();
if(lista->tamao == 0 && eleccin == 2)
eleccin = 7;
return eleccin;
}
/* -------- FIN lista_function.h --------- */
lista.c
/**********************\
* lista.c
*
\**********************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "lista.h"
#include "lista _function.h"
int main (void)
{
char eleccin;
char *nom;
Lista *lista;
Elemento *actual;
if ((lista = (Lista *) malloc (sizeof (Lista))) == NULL)
return -1;
if ((nom = (char *) malloc (50)) == NULL)
return -1;
actual = NULL;
eleccin = 'o';
inicialisacion (lista);
int pos, k;
while (eleccin!= 7){
eleccin = menu (lista, &k);
switch (eleccin){
case 1:
printf ("Ingrese un elemento : ");
scanf ("%s", nom);
getchar ();
if (lista->tamao == 0)
ins_en_lista_vacia (lista, nom);
else
ins_inicio_lista (lista, nom);
printf ("%d elementos:ini=%s,fin=%s\n", lista->tamao,
lista->inicio->dato, lista->fin->dato);
muestra (lista);
break;
case 2:
printf ("Ingrese un elemento: ");
scanf ("%s", nom);
getchar ();
ins_fin_lista (lista, lista->fin, nom);
printf ("%d elementos:ini=%s,fin=%s\n", lista->tamao,
lista->inicio->dato, lista->fin->dato);
muestra (lista);
break;
case 3:
printf ("Ingrese un elemento: ");
scanf ("%s", nom);
getchar ();
do{
printf ("Ingrese la posicion: ");
scanf ("%d", &pos);
}
while (pos < 1 || pos > lista->tamao);
getchar ();
if (lista->tamao == 1 || pos == lista->tamao){
k = 1;
printf("-----------------------------------------------\n");
printf("/!\\Fracaso la insercion.Utilice el menu {1|2} /!\\\n");
printf("-----------------------------------------------\n");
break;
}
ins_lista (lista, nom, pos);
printf ("%d elementos:ini=%s,fin=%s\n", lista->tamao,
lista->inicio->dato, lista->fin->dato);
muestra (lista);
break;
case 4:
sup_inicio (lista);
if (lista->tamao != 0)
printf ("%d elementos:ini=%s,fin=%s\n", lista->tamao,
lista->inicio->dato, lista->fin->dato);
else
printf ("lista vacia\n");
muestra (lista);
break;
case 5:
do{
printf ("Ingrese la posicion : ");
scanf ("%d", &pos);
}
while (pos < 1 || pos > lista->tamao);
getchar ();
sup_en_lista (lista, pos);
if (lista->tamao != 0)
printf ("%d elementos:ini=%s,fin=%s\n", lista->tamao,
lista->inicio->dato, lista->fin->dato);
else
printf ("lista vacia\n");
muestra (lista);
break;
case 6:
destruir (lista);
printf ("la lista ha sido destruida: %d elementos\n", lista->tamao);
break;
}
}
return 0;
}