You are on page 1of 16

Corporativo Internacional Universitario

1-2 Estructuras Lineales, Algoritmos para Manipular Listas


CAROLINA LEYVA ARCINIEGA
INFORMATICA ADMINISTRATIVA

2012

caro_17_12@hotmail.com

Introduccion
Contina la exposicin de los distintos algoritmos existentes para manipular listas simplemente enlazadas; sin el leccin anterior se presentaban algoritmos iterativos, en sta se vern en su versin recursiva. Las estructuras lineales son importantes porque aparecen con mucha frecuencia en situaciones de la vida Una cola de clientes de un banco, las instrucciones deun programa, los caracteres de una cadena o las pginas de un libroCaractersticas: existe un nico elemento, llamado primero, existe un nico elemento, llamado ltimo, cada elemento, excepto el primero, tiene un nico predecesory ,cada elemento, excepto el ltimo, tiene un nico sucesor Operaciones: crear la estructura vaca, insertar un elemento, borrar un elemento y obtener un elemento.

Estructuras lineales de datos


Esta seccin est orientada a comprender y manejar las estructuras lineales de datos, teniendo en cuenta la representacin lgica y fsica de las mismas y el lenguaje de programacin utilizado. CONTENIDOS: Conceptualizacin de las estructuras lineales de datos:  Introduccin y aplicaciones  Conceptos bsicos, definicin y representacin lgica  Tipo abstracto de dato: Pila, Cola, Dipolo y Lista  Tipos de estructuras de almacenamiento

Pila
Una pila, es la estructura de datos mencionada en el ejemplo anterior, es decir, un altero de objetos. O mas formalmente, una estructura de datos en la cual solo se pueden hacer 2 operaciones: colocar un elemento al final, o quitar un elemento del final. Lo nico que se puede hacer en una pila es colocar un objeto hasta arriba, o quitar el objeto que esta arriba, ya que si se quita un objeto de abajo o del centro (lo mismo que si se intenta aadir uno), la pila Colapsara. Si queremos programar algo similar, lo mas obvio es guardar la informacin de la pila en un arreglo. Una pila es un subtipo de las listas donde el acceso est restringido a un solo extremos de la lista, en este caso al tope de la misma. Un ejemplo de esta estructura es una pila de bandejas de un restaurante de comida rpida (self service) o una pila de platos, etc. Si se analiza el ejemplo en detalle, se tiene que cualquier cliente del restaurante, al llegar toma la primera bandeja que encuentra en la pila de bandejas, es decir la que est encima de todas las dems. Asimismo, cuando el empleado del restaurante coloca bandejas limpias en la pila, lo hace colocndolas encima de la que est arriba, puesto que es ms trabajo, alzar algunas y colocar las limpias entre las que quedan y las que alz. Las operaciones bsicas sobre una pila son: crearla, destruirla, agregar un nuevo elemento, suprimir un elemento, consultar el elemento del tope y verificar si est vaca. Sobre la base de estas operaciones se especifica el TAD Pila Esta especificacin incluye operaciones que pueden ser extendidas en la implementacin para soportar otras operaciones tiles de acuerdo a las aplicaciones que la puedan utilizar. En Universidad de Los Andes. Facultad de Ingeniera. Escuela de Sistemas. Departamento de Computacin. Estructuras de datos. Isabel M. Besembel C. y Dulce M. Rivero A. B-00 34 particular, toda implementacin debe contener las operaciones bsicas

definidas para el tipo y puede ser ampliada con otras adicionales. Obviamente, el programa de chat no usa una pila para eso, ya que si usara una pila, el receptor leera los mensajes en el orden inverso que el emisor los escribi. Es decir, en una pila el ltimo que entra es el primero que sale. De ah que a las pilas se les conozca como estructuras LIFO (Last In, First Out). Existen otras estructuras llamadas colas, en una cola el primero que entra es el primero que sale. Su nombre deriva de las filas que se hacen en los supermercados, cines, bancos, etc. Donde el primero que llega, es el primero en ser atendido, y el ltimo que llega es el ltimo en ser atendido (suponiendo que no haya preferencias burocrticas en dicho establecimiento).

Colas
Imagina una conversacin de chat entre 2 personas, aunque los conversantes no se den cuenta, existe algo llamado lag, es decir, el tiempo que tardan las 2 computadoras en mandarse y recibir los mensajes. Dependiendo de la conexin, el lag puede variar entre menos de un segundo o incluso mas de un minuto. Si por un momento, por falla del servidor, una de las 2 computadoras pierde la conexin, y en ese momento un usuario est intentando mandar varios mensajes, el programa de chat guardar los mensajes que el usuario est tratando de mandar, y cuando se recupere la conexin, el programa de chat mandar los mensajes en el mismo orden que el usuario los escribi. Las colas, son conocidas como estructuras FIFO (First In, First Out). Una cola es una estructura de datos, en la cual slo se pueden aplicar estas dos operaciones: colocar un elemento al final, o quitar un elemento del principio. Para representar una cola, obviamente necesitamos tambin un arreglo; supongamos que hay varios participantes en la cola para el registro de la OMI. Cada participante tiene un nombre que consiste de un nmero entero mayor o igual que 1.(Son bastante populares esos nombres en nuestros das) Y como faltan muchos estados a la OMI, solo habr 10 participantes. Entonces el arreglo podra lucir algo asi... 0000000000 En ese momento llega 3 y se forma 3000000000 Luego llega 5 y se forma 3500000000 Despus llega 4 y se forma 3450000000 Luego llega 9, y despus de eso llega 2 3459200000 Entonces al encargado del registro se le ocurre comenzar a atender, y atiende a 3.

En la vida real, los participantes daran un paso hacia delante, pero en una computadora, para simular eso, sera necesario recorrer todo el arreglo, lo cual es muy lento; por ello, es mas practico dejar el 5 Tutorial de Estructuras de Datos Bsicas Por Luis E. Vargas Azcona primer espacio de la cola en blanco. 0459200000 Luego se atiende a 4 0059200000 En ese momento llega 1 corriendo y se forma 0059210000 etc. Ya para este momento, te debes de estar imaginando que para implementar una cola, nicamente se requiere un arreglo y dos variables, donde las variables indican donde inicia y donde termina la cola. En un problema de olimpiada, siempre podremos saber cuantos elementos se formarn en la cola. Sin embargo, suponiendo que se forma 1 e inmediatamente es atendido, se vuelve a formar y vuelve a ser atendido inmediatamente, y as 1 000 veces, entonces, de esa manera se requerira un arreglo de tamao 1 000, cuando nunca hay mas de un elemento dentro de la cola. Para evitar eso, podemos aadir elementos al principio de la cola si ya no hay espacio al final. Por ejemplo, si luego de que se atendi a muchos participantes, la cola est de esta forma: 0000000073 Y para rectificar algo 5 vuelve a formarse, podemos colocar a 5 al principio 5000000073 Luego si 4 vuelve a formarse 5400000073 Puede parecer extrao esto, pero el programa sabr que la cola empieza donde est 7 y termina donde Est 4. As que si el organizador atiende al siguiente, atender a 7, y la cola quedar de esta manera 5400000003 Luego atender a 3 5400000000 Despus atender a 5 0400000000 Y as sucesivamente... Implementar la operacin de meter un elemento a la cola es muy sencillo: Cola [fin++]=elemento; if(fin>=tamao de la cola) fin=0; Y casi lo mismo es sacar un elemento de la cola inicio++;

if(inicio>=tamao de la cola) inicio=0; Una cola es otro subtipo de las listas donde el acceso est restringido a los extremos de la lista, es decir al inicio y al fin de la misma. Un ejemplo de esta estructura es una cola de personas en un restaurante de comida rpida (self service). En el ejemplo, se tiene que cualquier cliente del restaurante, al llegar entra a la fila de clientes que van a comer en el mismo por el final de la fila. Si la cola tiene algunos clientes, l debe esperar hasta llegar al inicio de la cola para poder ser servido. El cliente al inicio de la cola sale de la misma, en cuanto deja de ser servido, es decir ya tiene su comida y pasa a una mesa disponible para comer. Al salir de la cola el primer cliente, los que estn detrs se mueven o lo que es lo mismo, el inicio o tope de la cola se mueve al que era el segundo cliente que pasa a ser el nuevo primer cliente en la cola. Asimismo, cuando el nuevo cliente llega a la cola, se coloca al final de la misma, por lo cual el fin de la cola se mueve a la posicin del nuevo cliente. Aunque, tericamente, cualquier cliente puede salirse de la cola en un momento dado, en este caso no se le permite, la nica manera de salir es llegar a la posicin inicial. Se puede hacer la analoga con una fila donde hay barandas de lado y lado, que normalmente colocan para evitar que las personas entren y salgan por otro lugar que no sea el inicio y fin de la fila. Similar al subtipo pila, en la cola las operaciones bsicas son: creacin, destruccin, insercin al final de un nuevo elemento, eliminacin del inicio de un elemento, consultar que elemento est al inicio y cual al final, y verificar si la cola est vaca

Lista
La lista es el tipo ms general de estructura lineal donde las inserciones y eliminaciones se hacen en cualquier punto de la lista, por ello se debe especificar donde se requiere que se haga la operacin. La especificacin de este TAD se muestra en la figura Sus operaciones bsicas son: creacin, destruccin, insercin, eliminacin, consulta y verificacin de lista vaca.

Listas Enlazadas
Frecuentemente necesitamos tener almacenadas unas k listas de datos en memoria, sabiendo que el nmero total de datos en memoria no sobre pasa n. Si disponemos de suficiente memoria, podemos guardar en memoria n arreglos de tamao k o una matriz de tamao nk, pero no siempre dispondremos de tanta memoria. Tambien hay veces que se requieren tener listas de nmeros y agregar nmeros a dichas listas pero no al final ni al principio, sino en medio.

Para solucionar estos y otros problemas, existen las litas enlazadas. Las listas enlazadas son estructuras de datos compuestas por una sucesin de elementos llamados nodos; en la que cada nodo contiene un dato y la direccin del proximo nodo, en caso de que haya prximo. La siguiente imagen muestra una representacin grfica de una lista enlazada. Una forma de definir un nodo es: Una estructura vaca

Un elemento de informacin y un en lace a otro nodo.


La tarea de implementar una enlazada puede hacerse eficazmente con 2 arreglos: uno para guardar los datos y otro para guardar los enlaces, adems se requiere una variable que diga el tamao de la lista de la siguiente manera... int dato[tamao mximo de la lista]; int prximo[tamao mximo de la lista]; int tam_lista=1; //Tamao de la lista Lo nico que falta definir es el elemento vaco, para ello, podemos asumir que el dato 0 es el elemento vaco, y en el momento que nos encontremos con l, sabemos que la lista ya habr terminado. Insertar un nodo con un dato x, justo despues de otro nodo k, se puede hacer fcilmente en tiempo 7 Constante: 1 void insertar(int x, int k){ 2 dato[tam_lista]=x; 3 proximo[tam_lista]=proximo[k]; 4 proximo[k]=tam_lista++; 5} Lo que hace este cdigo es colocar x en el primer espacio en blanco dentro del arreglo datos, luego colocar un enlace al sucesor de k en el primer espacio en blanco dentro del arreglo de prximo, y hacer que k apunte al nodo que se acaba de crear. De esa forma k apuntar al nuevo nodo, y el nuevo nodo apuntar al nodo que apuntaba k. El siguiente cdigo imprime todos los datos contenidos en una lista, asumiendo que 1 es el primer elemento de dicha lista. 1 for(i=1;i!=0;i=prximo[i]) 2 printf(%d, dato[i]);

Implementacin de listas simplemente enlazadas en la notacin algortmica


Operaciones sobre listas (simplemente enlazadas) implementadas recursivamente Recorrido de una lista simplemente enlazada (de forma recursiva) accin recorrer (cabezaLista puntero a nodo) inicio si cabezaLista NIL entonces escribir cabezaLista .numero llamar recorrer (cabezaLista .siguiente) fin si fin accin En el algoritmo que se presenta el caso base podra decirse que es elptico1 puesto que ninguna accin se debe realizar para recorrer una lista vaca; as, slo aparece el caso recursivo que se limita a imprimir el contenido de la cabeza de la lista recibida y procede a recorrer el resto de la lista (una lista cuya cabeza es el elemento que sigue al actual). A continuacin se muestra de forma grfica el recorrido recursivo de una lista con los nmeros 1, 2 y 3: llamar recorrer (lista) 2 3 lista 1 NIL inicio si cabezaLista NIL entonces escribir cabezaLista-.numero llamar recorrer (cabezaLista .siguiente) fin si fin accin La primera invocacin de la accin imprime el contenido de la cabeza de la lista (1) y invoca de nuevo la accin para el resto de la lista. 3 lista 2 NIL inicio si cabezaLista NIL entonces escribir cabezaLista-.numero llamar recorrer (cabezaLista .siguiente) fin si fin accin La segunda invocacin imprime el contenido de la cabeza de la lista, en este caso el resto de la lista anterior, con lo cual aparece por pantalla el nmero 2 y se invoca nuevamente la accin para el resto de la lista.

lista 3 NIL inicio si cabezaLista NIL entonces escribir cabezaLista-.numero llamar recorrer (cabezaLista .siguiente) fin si fin accin La tercera invocacin imprime el contenido de la cabeza de la lista, en este caso el resto del resto de la lista anterior, mostrndose el nmero 3 e invocando la accin para el resto de la lista. lista NIL inicio si cabezaLista NIL entonces escribir cabezaLista .numero llamar recorrer (cabezaLista .siguiente) fin si fin accin Esta cuarta invocacin recibe una lista vaca, por tanto, no hace nada y retorna a la tercera invocacin que finaliza y retorna a la segunda que, a su vez, finaliza y retorna a la primera invocacin que tambin finaliza y devuelve el control al programa principal. 1 Elipsis: figura de construccin que consiste en omitir en la oracin palabras que no son indispensables para la claridad del sentido.

Estructuras dinmicas lineales


Bsqueda de un elemento en una lista simplemente enlazada (de forma recursiva) La operacin de bsqueda se basa en la de recorrido; bsicamente se trata de recorrer la lista hasta que se encuentre el elemento o se llegue al final, retornando un puntero al elemento encontrado (o NIL en caso contrario). puntero a nodo funcin buscar (cabezaLista puntero a nodo, elemento entero) inicio si cabezaLista NIL entonces si cabezaLista .numero = elemento entonces buscar cabezaLista si no llamar buscar (cabezaLista .siguiente,elemento) fin si si no buscar NIL fin si fin accin

Insercin de un elemento en una lista simplemente enlazada Al igual que en la leccin anterior, se proceder a implementar las operaciones de insercin en una cola y en una lista ordenada ascendentemente; la insercin en una pila no se puede implementar de forma recursiva puesto que es un problema que no consiste en una repeticin de pasos. Insercin en una cola (de forma recursiva) Como ya se ha dicho, la insercin en una cola precisa buscar el ltimo elemento de la lista e insertar el nuevo elemento detrs del mismo. accin insertarCola (cabezaLista puntero a nodo, dato_nuevo entero) inicio si cabezaLista NIL entonces llamar insertarCola (cabezaLista .siguiente,dato_nuevo) si no crear (cabezaLista) cabezaLista .siguiente NIL cabezaLista .numero dato fin si fin accin A continuacin se muestra de forma grfica la insercin del nmero 3 en una lista que ya contiene los enteros 1 y 2: insertarCola (lista, 3) 2 lista 1 NIL inicio si cabezaLista NIL entonces llamar insertarCola (cabezaLista-.siguiente,dato_nuevo) si no crear (cabezaLista) cabezaLista .siguiente NIL cabezaLista .numero dato fin si fin accin En la primera invocacin se comprueba que la cola no est vaca por lo que se procede a insertar, recursivamente, el elemento en el resto de la cola (2). lista 2 NIL inicio si cabezaLista NIL entonces llamar insertarCola (cabezaLista-.siguiente,dato_nuevo) si no crear (cabezaLista) cabezaLista .siguiente NIL

cabezaLista .numero dato fin si fin accin En la segunda invocacin se comprueba que la cola no est vaca por lo que se invoca recursivamente la accin para insertar el elemetno. Leccin 11 Estructuras dinmicas lineales (ii) 3 lista NIL inicio si cabezaLista NIL entonces llamar insertarCola (cabezaLista .siguiente,dato_nuevo) si no crear (cabezaLista) cabezaLista .siguiente NIL cabezaLista .numero dato fin si fin accin En la tercera invocacin la cola est vaca, por tanto, es posible crear un nuevo elemento. lista inicio si cabezaLista NIL entonces llamar insertarCola (cabezaLista .siguiente,dato_nuevo) si no crear (cabezaLista) cabezaLista .siguiente NIL cabezaLista .numero dato fin si fin accin El nuevo elemento es creado. lista NIL inicio si cabezaLista NIL entonces llamar insertarCola (cabezaLista .siguiente,dato_nuevo) si no crear (cabezaLista) cabezaLista-.siguiente NIL cabezaLista .numero dato fin si fin accin El nuevo elemento es el primero y el ltimo de su cola. lista 3 NIL inicio si cabezaLista NIL entonces llamar insertarCola (cabezaLista .siguiente,dato_nuevo) si no crear (cabezaLista)

cabezaLista .siguiente NIL cabezaLista-.numero dato fin si fin accin Se asigna un valor al nuevo elemento y se retorna desde la tercera invocacin a la segunda. 3 lista 2 NIL inicio si cabezaLista NIL entonces llamar insertarCola (cabezaLista .siguiente,dato_nuevo) si no crear (cabezaLista) cabezaLista .siguiente NIL cabezaLista .numero dato fin si fin accin La segunda invocacin ya ha insertado, recursivamente, el nuevo elemento as que puede retornar a la primera. 2 3 lista 1 NIL inicio si cabezaLista NIL entonces llamar insertarCola (cabezaLista .siguiente,dato_nuevo) si no crear (cabezaLista) cabezaLista .siguiente NIL cabezaLista .numero dato fin si fin accin La primera invocacin ha logrado insertar, recursivamente, el nuevo elemento por lo que puede devolver el control al programa principal.

Insercin en una lista ordenada ascendentemente (de forma recursiva)


accin insertarOrdenado (cabezaLista variables nuevo puntero a nodo inicio puntero a nodo, dato entero)

si cabezaLista NIL entonces si cabezaLista .numero dato entonces crear (nuevo) nuevo .siguiente cabezaLista .siguiente cabezaLista .siguiente nuevo nuevo .numero cabezaLista .numero cabezaLista .numero dato si no llamar insertarOrdenado (cabezaLista .siguiente,dato) fin si si no crear (cabezaLista) cabezaLista .siguiente NIL cabezaLista .numero dato fin si fin accin

Eliminar un elemento de una lista simplemente enlazada (de forma recursiva)


El algoritmo bsico de eliminacin simplemente debe recorrer la lista hasta encontrar el dato a eliminar, enlazar la lista de forma adecuada y destruir el nodo sobrante. accin eliminarElemento (cabezaLista puntero a nodo, dato entero) variables cursor puntero a nodo inicio si cabezaLista NIL entonces si cabezaLista .numero = dato entonces si cabezaLista .siguiente NIL entonces cursor cabezaLista .siguiente cabezaLista .numero cursor .numero cabezaLista .siguiente cursor .siguiente destruir (cursor) si no destruir (cabezaLista) fin si si no si cabezaLista .siguiente NIL entonces si cabezaLista .siguiente .numero = dato entonces cursor cabezaLista .siguiente cabezaLista .siguiente cursor .siguiente destruir (cursor) si no

llamar eliminarElemento (cabezaLista .siguiente,dato) fin si fin si fin si fin si fin accin Vaciado de una lista simplemente enlazada (de forma recursiva) accin vaciarLista (cabezaLista puntero a nodo) inicio si cabezaLista .siguiente NIL entonces llamar vaciarLista (cabezaLista .siguiente) fin si destruir(cabezaLista) fin accin Para vaciar una lista simplemente enlazada de forma recursiva basta con vaciar el resto de la lista, si es que existe, y despus eliminar el nodo que se encuentra en la cabeza. A continuacin se muestra de forma grfica el vaciado recursivo de la lista que contiene los nmeros 1, 2 y 3. llamar vaciarLista (lista) Leccin 11 Estructuras dinmicas lineales (ii) 5 2 3 lista 1 NIL inicio si cabezaLista-.siguiente NIL entonces llamar vaciarLista (cabezaLista-.siguiente) fin si destruir(cabezaLista) fin accin En la primera invocacin se debe vaciar el resto de la lista (2 y 3). 3 lista 2 NIL inicio si cabezaLista-.siguiente NIL entonces llamar vaciarLista (cabezaLista-.siguiente) fin si destruir(cabezaLista) fin accin En la segunda invocacin se debe vaciar el resto de la lista (3). lista 3 NIL

inicio si cabezaLista .siguiente NIL entonces llamar vaciarLista (cabezaLista .siguiente) fin si destruir(cabezaLista) fin accin En la tercera invocacin no hay resto de lista con lo cual se destruye la cabeza (3). lista inicio si cabezaLista .siguiente NIL entonces llamar vaciarLista (cabezaLista .siguiente) fin si destruir(cabezaLista) fin accin Una vez destruida la cabeza de la lista en la tercera invocacin se retorna a la segunda. lista 2 inicio si cabezaLista .siguiente NIL entonces llamar vaciarLista (cabezaLista .siguiente) fin si destruir(cabezaLista) fin accin En la segunda invocacin ya se ha vaciado el resto de la lista, por lo que se puede destruir la cabeza (2). lista inicio si cabezaLista .siguiente NIL entonces llamar vaciarLista (cabezaLista .siguiente) fin si destruir(cabezaLista) fin accin Destruida la cabeza de la lista de la segunda invocacin se puede retornar a la primera. lista 1 inicio si cabezaLista .siguiente NIL entonces llamar vaciarLista (cabezaLista .siguiente) fin si destruir(cabezaLista) fin accin Al haberse vaciado el resto de la lista en la primera invocacin se elimina la cabeza. lista inicio si cabezaLista .siguiente NIL entonces

llamar vaciarLista (cabezaLista .siguiente) fin si destruir(cabezaLista) fin accin La primera invocacin ha destruido todos los elementos de la cola a partir del segundo y, despus, la cabeza. Una vez hecho esto retorna

FUENTE
www.wikipedia.org. www.algoritmia.net,

Tutorial de Estructuras de Datos Bsicas Por Luis E. Vargas Azcona

You might also like