Anda di halaman 1dari 6

Listas enlazadas circulares En una lista enlazada circular, el primer y el ltimo nodo estn unidos juntos.

Esto se puede hacer tanto para listas enlazadas simples como para las doblemente enlazadas. Para recorrer un lista enlazada circular podemos empezar por cualquier nodo y seguir la lista en cualquier direccin hasta que se regrese hasta el nodo original. Desde otro punto de vista, las listas enlazadas circulares pueden ser vistas como listas sin comienzo ni fin. Este tipo de listas es el ms usado para dirigir buffers para "ingerir" datos, y para visitar todos los nodos de una lista a partir de uno dado.

Una lista enlazada circular que contiene tres valores enteros Listas enlazadas circulares simples Cada nodo tiene un enlace, similar al de las listas enlazadas simples, excepto que el siguiente nodo del ltimo apunta al primero. Como en una lista enlazada simple, los nuevos nodos pueden ser solo eficientemente insertados despus de uno que ya tengamos referenciado. Por esta razn, es usual quedarse con una referencia solamente al ltimo elemento en una lista enlazada circular simple, esto nos permite rpidas inserciones al principio, y tambin permite accesos al primer nodo desde el puntero del ltimo nodo.

**Qu es una lista?Una lista enlazada es un conjunto de elementos llamados nodos en los que cada uno de ellos contiene un dato y tambin la direccin del siguiente nodo,donde el orden de los mismos seestablece mediante punteros. La idea bsica es que cada componente de la listaincluya un puntero que indique donde puede encontrarse el siguiente componente por lo que el orden relativo de estos puede ser fcilmente alterado modificando los punteros lo que permite, a su vez, aadir o suprimir elementos de la lista. El primer elemento de la lista es la cabecera, que slo contiene un puntero que seala el primer elemento de la lista. El ltimo nodo de la lista apunta a NULL (nulo) porque no hay ms nodos en la lista. Se usar el trmino NULL para designar el final de la lista. Las operaciones que podemos realizar sobre una lista enlazada son las siguientes: Recorrido. Esta operacin consiste en visitar cada uno de los nodos que forman la lista . Para recorrer todos los nodos de la lista, se comienza con el primero, se toma el valor del campo liga para avanzar al segundo nodo, el campo liga de este nodo nos dar la direccin del tercer nodo, y as sucesivamente. Insercin. Esta operacin consiste en agregar un nuevo nodo a la lista. Para esta operacin se pueden considerar tres casos:

o o o

Insertar un nodo al inicio. Insertar un nodo antes o despus de cierto nodo. Insertar un nodo al final.

Borrado. La operacin de borrado consiste en quitar un nodo de la lista, redefiniendo las ligas que correspondan. Se pueden presentar cuatro casos: o o o o Eliminar el primer nodo. Eliminar el ltimo nodo. Eliminar un nodo con cierta informacin. Eliminar el nodo anterior o posterior al nodo cierta con informacin.

Bsqueda. Esta operacin consiste en visitar cada uno de los nodos, tomando al campo liga como puntero al siguiente nodo a visitar.

Se dice que una lista enlazada es circular cuando el ltimo nodo apunta al primero, como se muestra en la siguiente figura.

Para insertar nodos en una lista circular consideramos dos casos:

Cuando la lista est vaca. En este caso el nodo hacemos que apunte as mismo o sea nodo->siguiente = nodo, y este viene a ser el puntero de la lista (Lc=nodo).

Cuando la lista no est vaca. Hacemos que nodo->siguiente apunte a Lc->siguiente, despus, y este viene a ser el puntero de la lista ( Lc=nodo);

**

4.5 Listas Circulares

Las listas circulares tienen la caracterstica de que el ltimo elemento de la misma apunta al primero

La siguiente figura es una representacin grfica de una lista circular.

Enseguida se mostrarn los algoritmos ms comunes en listas circulares. Al igual que en las secciones anteriores, utilizaremos el apuntador top para hacer referencia al primer nodo en la lista.
Algoritmo de creacin
repite new(p) lee(p(dato)) si top=nil entonces top<--p q<--p en caso contrario q(liga)<--p q<--p p(liga)<--top mensaje (otro nodo ?) lee(respuesta) hasta respuesta=no

Algoritmo para recorrer la lista


p<--top repite escribe(p(dato)) p<--p(liga) hasta p=top

Algoritmo para insertar antes de 'X' informacin


new(p) lee(p(dato)) si top=nil entonces top<--p p(liga)<--top en caso contrario mensaje(antes de ?) lee(x) q<--top r<--top(liga) repite si q(dato)=x entonces p(liga)<--q r(liga)<--p si p(liga)=top entonces top<--p q<--q(liga)

r<--r(liga) hasta q=top

Algoritmo para insertar despus de 'X' informacin


new(p) lee(p(dato)) mensaje(despus de ?) lee(x) q<--top r<--top(liga) repite si q(dato)=x entonces q(liga)<--p p(liga)<--r q<--q(liga) r<--r(liga) hasta q=top

Algoritmo para borrar


mensaje(valor a borrar ) lee(valor_a_borrar) q<--top r<--top p<--top mientras q(liga)<>top haz q<--q(liga) repite si p(dato)=valor_a_borrar entonces si p=top entonces si top(liga)=top entonces top<--NIL en caso contrario top<--top(liga) q(liga)<--top en caso contrario r(liga)<--p(liga) dispose(p) p<--top en caso contrario r<--p p<--p(liga) hasta p=top

**
#include #include #include #include <stdio.h> <conio.h> <stdlib.h> //exit() <alloc.h>

typedef struct _agenda { char nombre[20]; char telefono[12]; _agenda *siguiente;

}; void mostrar_menu(); void anadir_elemento(); void mostrar_lista(); _agenda *primero, *ultimo; /*De momento lo haremos con variables globales, ms adelante veremos como pasar punteros a funciones*/ void main() { char opcion; primero = (_agenda *) NULL; ultimo = (_agenda *) NULL; do { mostrar_menu(); opcion = getch(); switch ( opcion ) { case '1': anadir_elemento(); break; case '2': printf("Ir pensando como hacer esto :D\n"); break; case '3': mostrar_lista(); break; case '4': exit( 1 ); default: printf( "Opcin no vlida\n" ); break; } } while (opcion!='4'); } void mostrar_menu() { printf("\n\nMen:\n=====\n\n"); printf("1.- Aadir elementos\n"); printf("2.- Borrar elementos\n"); printf("3.- Mostrar lista\n"); printf("4.- Salir\n\n"); printf("Escoge una opcin: ");fflush(stdin); } /* Con esta funcin aadimos un elemento al final de la lista */ void anadir_elemento() { _agenda *nuevo; /* reservamos memoria para el nuevo elemento */ nuevo = (_agenda *) malloc (sizeof(_agenda)); if (nuevo==NULL) printf( "No hay memoria disponible!\n"); else { printf("\nNuevo elemento:\n"); printf("Nombre: "); fflush(stdin); gets(nuevo->nombre); printf("Telfono: "); fflush(stdin); gets(nuevo->telefono); /* el campo siguiente va a ser NULL por ser el ltimo elemento la lista */ nuevo->siguiente = NULL; /* ahora metemos el nuevo elemento en la lista. lo situamos al final de la lista */ /* comprobamos si l0a lista est vaca. si primero==NULL es que no

hay ningn elemento en la lista. tambin vale ultimo==NULL */ if (primero==NULL) { printf( "Primer elemento\n"); primero = nuevo; ultimo = nuevo; } else { /* el que hasta ahora era el ltimo tiene que apuntar al nuevo */ ultimo->siguiente = nuevo; /* hacemos que el nuevo sea ahora el ltimo */ ultimo = nuevo; } } } void mostrar_lista() { _agenda *auxiliar; /* lo usamos para recorrer la lista */ int i; i=0; auxiliar = primero; printf("\nMostrando la lista completa:\n"); while (auxiliar!=NULL) { printf( "Nombre: %s, Telfono: %s\n", auxiliar->nombre,auxiliar->telefono); auxiliar = auxiliar->siguiente; i++; } if (i==0) printf( "\nLa lista est vaca!!\n" ); }