Professional Documents
Culture Documents
Apellidos
Nombre
DNI
Fecha de Nacimiento.
1
2
3
4
5
6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
System.out.println( "Ingrese el
nodo.nom = leer.next();
System.out.println( "Ingrese la
nodo.calif1 = leer.nextInt();
System.out.println( "Ingrese la
nodo.calif2 = leer.nextInt();
System.out.println( "Ingrese la
nodo.calif3 = leer.nextInt();
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 }
45
46
47
48
while(op != 2);
List lista2 = new ArrayList(lista);
Iterator it = lista2.iterator();
while (it.hasNext()){
System.out.println(it.next()+"");
}
En este post me voy a enfocar en 3 cosas: agregar un nuevo nodo a la lista (al final), mostrar todos
los nodos (recorrerlo) y eliminar un nodo de la lista. Antes de entrar a estos temas, hay que ver
como se declara la estructura y la forma en que se usa. En este ejemplo, estoy haciendo una lista
que guarda algunos datos de videojuegos. Aqu est la declaracin de la estructura y una variable
global que apunta al primer nodo de la lista:
La funcin principal del programa (main) no tiene mayor ciencia. Bsicamente solo muestra un
men y pide una opcin. En base a la opcin deseada manda llamar funciones para dar de alta,
consultar todos o eliminar alguno. Una nota antes de seguir: este programa lo hice usando el
compilador Dev-C++ varsin 4.9.9.2. Este es el cdigo (haz clic sobre la imagen para verlo ms
grande):
Voy a comenzar hablando de la funcin que da de alta un nodo al final de la lista. Primero declaro
dos apuntadores a struct nodo: Temp y Temp2. Uso la funcin malloc para apartar RAM para
almacenar la estructura de forma dinmica. Si necesitas saber ms sobre el malloc, al final de este
post hay ligas a pginas que son referencias para que despejes dudas sobre su sintaxis y funcin.
Pero a grandes rasgos, el malloc sirve para asignarle memoria y devolver un apuntador hacia el
espacio reservado. Una vez apartada la memoria, lleno el nuevo nodo con los datos (que son los
parmetros nom, plat y pre) y al campo Sig le asigno el valor de NULL porque va a ser el ltimo de
la lista. Al final debo reorganizar los apuntadores: el apuntador Sig del elemento anterior debe
apuntar a este nuevo nodo. El cdigo que lo realiza es el siguiente:
Una vez resuelto el problema de dar de alta nodos, voy a explicar la forma en que se puede recorrer
la lista y mostrar los elementos. Esto lo hice en la funcin llamada MuestraTodo. Declaro un
apuntador llamado Temp (para no perder la costumbre, jeje) con el que voy a recorrer la lista. Uso
la variable i para mostrar el nmero de nodo en el que voy. Al principio igualo Temp a Inicio
para comenzar el recorrido. Y mientras no llego al final (o sea, Temp es diferente de NULL), muestro
lo que contiene el nodo. Fjate como se accesa un elemento por medio de un apuntador ya que
difiere de la forma en que se hace cuando no usas apuntador. En lugar del punto (.), se usa una
especie de flecha compuesta por el guin y el signo mayor que (->). Aqu est el cdigo:
Ahora lo nico que falta es mostrar la funcin que elimina un nodo de la lista. Esto es
relativamente sencillo y creo que el cdigo se explica por si solo (le puse un montn de
comentarios). Bsicamente es igual que la funcin MuestraTodo solo que esta vez, en lugar de
mostrar el elemento, veo si es igual al que busco. En caso que sea igual, veo si es el primero de la
lista. Si es el primero, solo cambio el valor de Inicio para que apunte al siguiente, y en caso
contrario, modifico el apuntador Sig del elemento anterior (convenientemente apuntado
porAnterior) para que apunte al que sigue. Una vez arreglado los apuntadores, libero la memoria
usando la instruccin free. Al final viene ms ayuda sobre free, pero bsicamente libera la
memoria que es apuntada por un apuntador (valga la redundancia). Al final devuelve un 1 si lo
encontr y lo pudo borrar y un 0 si no lo encuentra. Este es el cdigo de la funcin Eliminalo:
Estas son ligas donde puedes encontrar ms informacin sobre malloc y free (y algunas otras
funciones que te pueden resultar muy tiles). Hasta la prxima!
Otros recursos sobre listas simplemente ligadas: todo tipo de listas en Wikipedia y
esteexcelente recurso sobre listas del Cinvestav (ojo: all hay ligas para ver agregar y
eliminar nodos).
Listas ligadas
Los siguientes algoritmos fueron tomados de "Estructuras de Datos", Cair Guardati, 2a. Ed., McGraw Hill, 2002.
Algoritmo 5.1
CREAINICIO(P)
{Este algoritmo crea una lista, agregando cada nuevo nodo al inicio de la
misma}
{ P y Q son variables de tipo puntero. P apuntar al inicio de la lista}
1.
2.
3.
4.
5.
Algoritmo 5.2
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.
2.
3.
4.
5.
Para poder dar de alta un dato en una lista ligada sencilla es necesario recorrer la
lista nodo por nodo hasta encontrar la posicin adecuada. Se crea un nuevo nodo,
se inserta el dato y se actualizan las ligas del nodo nuevo y del anterior para
intercalar el nuevo nodo en la lista.
Algoritmo 5.3
RECORREITERATIVO(P)
{Este algoritmo recorre una lista cuyo primer nodo est apuntado por P}
{Q es una variable de tipo puntero}
1.
2.
3.
Hacer Q = P
Repetir mientras Q =! NIL
Escribir Q->INFORMACUN
Hacer Q=Q->LIGA {Apunta al siguiente nodo de la lista}
{Fin del ciclo del paso 2}
Algoritmo 5.4
RECORRECURSIVO(P)
{Este algoritmo recorre una lista recursivamente.
nodo a visitar}
1.
la lista}
2.
P es el apuntador al
Si P =! NIL entonces
Escribir P->INFORMACIN
Llamar a RECORRECURSIVO con P->LIGA
{Llamada recursiva con el apuntador al siguiente nodo de
{Fin del condicional del paso 1}
Algoritmo 5.6
INSERTAFINAL(P)
{Este algoritmo inserta un nodo al final de la lista. P es el apuntador
al primer nodo
de la lista, y DATO es la informacin que se almacenar en el nuevo nodo}
{Q y T son variables de tipo puntero}
1.
2.
3.
4.
5.
Hacer T= P
Repetir mientras T ->Liga =! NIL
{Recorre la lista hasta llegar al ltimo elemento}
Hacer T=T->LIGA
{Fin del ciclo del paso 2}
CREA (Q)
Hacer Q->INFORMACIN =DATO, Q->LIGA =NIL y T ->LIGA =Q
Algoritmo 5.7
INSERTANTES ( P, DATO, REF )
{Este algoritmo inserta un nodo dado como referencia, REF. P es el
apuntador al
primer nodo de la lista, y DATO es la informacin que se almacenar en el
nuevo nodo}
{Q, X y T son variables de tipo puntero, BAND es una variable de tipo
booleano}
1.
2.
VERDADERO)
3.
4.
5.
Algoritmo 5.9
ELIMINAPRIMERO(P)
{Este algoritmo borra el primer elemento de una lista.
al primer nodo de la lista}
{Q es una variable de tipo puntero}
nodo}
P es el apuntador
1.
2.
Hacer Q = P
Si Q -> LIGA =! NIL {Verifica si la lista tiene slo un
3.
4.
Entonces
Hacer P= Q-> LIGA {Redefine el puntero al inicio}
Si no
Hacer P = NIL
{Fin del condicional del paso2}
QUITA(Q)
Algoritmo 5.10
ELIMINALTIMO(P)
{Este algoritmo borra el ltimo elemento de una lista.
al primer nodo de la lista}
{Q y T son variables de tipo puntero}
1.
elemento}
2.
P es el apuntador
Algoritmo 5.11
ELIMINAX( P, X )
{Este algoritmo elimina un nodo con informacin X de una lista. P es el
apuntador al primer nodo de la lista}
{Q y T son variables de tipo puntero. BAND es una variable de tipo
booleano}
1.
2.
VERDADERO)
3.
4.
el primero}
5.
(BAND =
Si Q ->LIGA =! NIL
Entonces
Hacer T = Q y Q = Q -> LIGA
Si no
Hacer BAND = FALSO
2.2
{Fin del condicional del paso 2.1}
{Fin del ciclo del paso 2}
Si BAND = FALSO
Entonces
Escribir El elemento no fue encontrado
Si no
4.1
SI P = Q {Verifica si el elemento a eliminar es
Entonces
Hacer P = Q->LIGA
Si no
Hacer T -> LIGA=Q-> LIGA
4.2
{Fin del condicional del paso 4.1}
QUITA(Q)
{Fin del condicional del paso 4}
Algoritmo 5.15
BUSCARRECURSIVO(P,X)
{Este algoritmo busca recursivamente al elemento con informacin X en una
lista que se encuentra desordenada. P es el apuntador del nodo a
visitar}
1.
Si ( P =! NIL)
Entonces
1.1
Si ( P ->INFORMACIN = X )
Entonces
Escribir El elemento se encuentra en la
lista
Si no
1.2
lista
2.
realizar
con
listas
incluyen
}
*Borrar todos los elementos de una lista
Borrar todos los elementos equivale a liberar la memoria asignada a cada
uno de los elementos de la misma. Se quiere borrar una lista, cuyo
primer elemento esta apuntado por p. Sus operaciones son las
siguientes:
while(p!=0)
{
q=p;
p=p->siguiente;
delete q;
}
Antes de borrar el elemento apuntado por q, se hace que p apunte al
siguiente elemento, por que si no se perdera el resto de la lista.