Sunteți pe pagina 1din 5

Algoritmos, Datos y Programas.

2011

Listas. Conceptos bsicos


Si se quiere almacenar una coleccin de elementos que estructura tenemos hasta el momento? Un arreglo -> necesito saber la cantidad de elementos.

Y si no conozco la cantidad de elementos? SOLUCION POSIBLE: utilizar los punteros vinculndolos unos con otros generando una nueva estructura (coleccin de punteros, donde cada uno conoce con quien se vincula).

LISTAS ENLAZADAS: Se crean a partir de punteros. Son estructuras donde se almacenan datos sin saber la cantidad de los mismos. Es una estructura dinmica: se reserva/libera memoria para datos segn sea conveniente. Los datos a enlazar son del mismo tipo homognea. Siempre debo guardar el puntero inicial de la lista, es decir el apuntador al primer nodo, para luego poder recorrerla, ya que a partir del primer elemento se puede acceder al siguiente y as sucesivamente. acceso secuencial.

a) Cmo es la estructura de una lista, por ejemplo de enteros? TYPE lista = ^nodo; nodo = record nro: integer; sig: lista; end;

Notar que es una definicin de estructura de datos recursiva: Dentro del nodo hay un campo sig (de tipo lista, es decir apunta a un nodo) b) Cmo creamos una lista? En este momento se debe tener en cuenta que se debe ir guardando cul es el puntero inicial de la lista.
... primero de la lista

Una lista puede ser creada agregando sus elementos siempre adelante, o atrs; o en el caso de listas ordenadas se lo debe ubicar en el lugar que corresponda. Por lo tanto tenemos tres formas de crear una lista: 1. Agregando elementos adelante. 2. Agregando elementos atrs.

Algoritmos, Datos y Programas. 2011

3. Agregando elementos ordenados por algn campo. Depender del enunciado cul estrategia tengo que usar. Ejercicio 1: Leer una secuencia de 20 nmeros y crear una lista agregando siempre al principio. PROGRAM uno; TYPE lista = ^nodo nodo = record nro: integer; sig: lista; end; var pri: lista; //Apunta al primer elemento de la lista num: integer; i: integer; procedure agregar (var pri:lista; num:integer); var aux:lista; begin //1. Creo el espacio en memoria para el nuevo elemento new (aux); aux^.nro:= num; //2. Asigno el dato aux^.sig:= pri; //3. Realizo el enganche. pri:= aux; //4. Modifico pri: el nuevo elemento ahora ser el primero de la lista. end;

begin pri:= nil; //Notar la necesidad del nil. Este puntero es pasado por referencia y lo utilizaremos para quedarnos con el primer elemento de la lista. Al comienzo de la ejecucin la lista esta vaca, para darnos cuenta de esa situacin ponemos el puntero pri en NIL. for i:= 1 to 20 do read (num); agregar(pri,num); end.

Ejercicio2: Realizar un programa que dada una lista le agregue un elemento al final. PROGRAM dos; TYPE lista = ^nodo nodo = record nro: integer; sig: lista; End;

var pri: lista; num: integer;

Algoritmos, Datos y Programas. 2011

procedure agregarFinal (var pri: lista; n: integer); var aux: lista; nue,ant: lista; begin //Creo el espacio en memoria para el nuevo elemento new (nue); nue^. nro:= n; //Asigno el dato nue^. sig:= nil; //Este elemento ser el ltimo, sig debe estar en nil. if (pri = nil) then //Es el primer elemento, actualizo pri pri:= nue else begin //quiere decir que ya tengo elementos insertados //recorro la lista con aux apunta al nodo actual y ant apunta al nodo anterior al actual. Cuando aux sea nil, es decir termin de recorrer la lista, ant qued apuntando al ltimo nodo de la lista. aux:= pri; while (aux <> nil) do begin ant:= aux; aux:= aux^.sig; end; ant^.Sig:= nue; end; end; begin generarLista(pri);//este proceso no est implementado. Suponer que ya est hecho. La lista creada puede tener 0, 1 o ms elementos. read (num); agregarFinal (pri, num); end.

Pregunta 1 Por qu necesitamos llevar un puntero que mantenga el anterior? (qu pasa si solo uso aux?).

Para pensar: Sabiendo que pri no es nil, la parte donde ya sabemos que hay elementos insertados (dentro del else) tambin puede ser escrito de la siguiente forma. NO necesita llevar la variable ant. aux:= pri; while (aux^. sig <> nil) do aux:= aux^. sig;

Algoritmos, Datos y Programas. 2011

aux^.sig:= nue;

Ejercicio 1: Cada vez que invocamos al agregarFinal, se est recorriendo toda la lista. Para evitar esto, adems de llevar un puntero al principio de la lista (pri) podra guardar un puntero al final de la lista (ult). Cada vez que se inserta un elemento se debe actualizar ult. Realice un procedure que agregue al final de la lista un entero siguiendo esta metodologa. El procedure debe tener el siguiente encabezado: Procedure agregarAlFinal(var pri, ult: lista; n: integer);

Ejercicio3: Realizar un programa que dada una lista inserte los elementos en forma ordenada PROGRAM dos; TYPE lista = ^nodo nodo = record nro: integer; sig: lista; End;

var pri: lista; num: integer;

procedure insertarOrdenado (var pri: lista; n: integer); var aux: lista; nue,ant: lista; begin new (nue); //Creo el espacio en memoria para el nuevo elemento nue^. nro:= n; //Asigno el dato nue^. sig:= nil; //Este elemento ser el ltimo, sig debe estar en nil. if (pri = nil) then //Es el primer elemento, actualizo pri pri:= nue else begin //quiere decir que ya tengo elementos insertados //recorro la lista con aux apunta al nodo actual y ant apunta al nodo anterior al actual. Cuando aux sea nil, es decir termin de recorrer la lista, ant qued apuntando al ltimo nodo de la lista.

Algoritmos, Datos y Programas. 2011

aux:= pri; while (aux <> nil) do begin ant:= aux; aux:= aux^.sig; end; ant^.Sig:= nue; end; end; begin generarLista(pri);//este proceso no est implementado. Suponer que ya est hecho. La lista creada puede tener 0, 1 o ms elementos. read (num); agregarFinal (pri, num); end.

Pregunta 2: Supongamos que quiero leer nmeros hasta que lea el 999 e insertarlos en una lista de forma que al recorrerla aparezcan en el orden que se leyeron. Qu estrategia de agregar debo usar?

Pregunta 3: Supongamos que quiero leer nmeros hasta que lea el 999 e insertarlos en una lista de forma que al recorrerla aparezcan en el orden INVERSO al que se leyeron. Qu estrategia de agregar debo usar?

S-ar putea să vă placă și