Page 271

4 Estructuras de datos: memoria din´amica

CC 2003, 2008 Andr´ es Marzal e Isabel Gracia

El bucle se limita a ((desplazar)) el puntero aux hasta que apunte al u ´ltimo elemento de la lista. Esta expresi´ on del bucle que busca el elemento final es m´as propia de la programaci´on C, m´as idiom´atica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · 249 Hemos dise˜ nado un m´etodo (que mejoraremos en el siguiente apartado) que permite insertar elementos por el final de una lista y hemos necesitado un bucle. ¿Har´a falta un bucle para insertar un elemento por delante en una lista cualquiera? ¿C´omo har´ıas para convertir la u ´ltima lista en esta otra?: info

lista

sig

info

1

sig

info

3

sig

info

8

sig

2

.............................................................................................

4.5.4.

Borrado de la cabeza

Vamos a aprender ahora a borrar elementos de una lista. Empezaremos por ver c´omo eliminar el primer elemento de una lista. Nuestro objetivo es, partiendo de esta lista: info

lista

sig

info

sig

info

8

3

sig

2

llegar a esta otra: info

lista

sig

info

8

sig

2

Como lo que deseamos es que lista pase a apuntar al segundo elemento de la lista, podr´ıamos dise˜ nar una aproximaci´ on directa modificando el valor de lista: 1 2 3

int main(void) { struct Nodo * lista = NULL, * aux , * nuevo;

4

... lista = lista->sig; // Mal! Se pierde la referencia a la cabeza original de la lista.

5

!

6 7

return 0;

8 9

}

El efecto obtenido por esa acci´ on es ´este: info

lista

3

sig

info

8

sig

info

sig

2

Efectivamente, hemos conseguido que la lista apuntada por lista sea lo que pretend´ıamos, pero hemos perdido la referencia a un nodo (el que hasta ahora era el primero) y ya no podemos liberarlo. Hemos provocado una fuga de memoria. Para liberar un bloque de memoria hemos de llamar a free con el puntero que apunta a la direcci´on en la que empieza el bloque. Nuestro bloque est´a apuntado por lista, as´ı que podr´ıamos pensar que la soluci´ on es trivial y que bastar´ıa con llamar a free antes de modificar lista: 1 2 3

int main(void) { struct Nodo * lista = NULL, * aux , * nuevo;

4

... free(lista); lista = lista->sig ; // Mal! lista no apunta a una zona de memoria v´ alida.

5 6

!

7 8

return 0;

9 10

}

Introducci´ on a la Programaci´ on con C

265

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement