Page 283

4 Estructuras de datos: memoria din´amica

CC 2003, 2008 Andr´ es Marzal e Isabel Gracia

aux lista

info

sig

info

3

sig

info

8

sig

2

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · 255 ¿Seguro que el bucle de borra_cola funciona correctamente siempre? Piensa si hace lo correcto cuando se le pasa una lista formada por un solo elemento. ............................................................................................. Si hemos localizado ya el u ´ltimo nodo de la lista, hemos de liberar su memoria: E lista.c E 1 2 3

TipoLista borra_cola(TipoLista lista) { struct Nodo * aux ;

4

if (lista != NULL) { for (aux = lista; aux ->sig != NULL; aux = aux ->sig) ; free(aux ); ... }

5 6 7 8 9 10

}

Llegamos as´ı a esta situaci´ on: aux info

lista

sig

3

info

sig

8

F´ıjate: s´olo nos falta conseguir que el nuevo u ´ltimo nodo (el de valor igual a 8) tenga como valor del campo sig a NULL. Problema: ¿y c´omo sabemos cu´al es el u ´ltimo nodo? No se puede saber. Ni siquiera utilizando un nuevo bucle de b´ usqueda del u ´ltimo nodo, ya que dicho bucle se basaba en que el u ´ltimo nodo es reconocible porque tiene a NULL como valor de sig, y ahora el u ´ltimo no apunta con sig a NULL. El ((truco)) consiste en usar otro puntero auxiliar y modificar el bucle de b´ usqueda del u ´ltimo para haga que el nuevo puntero auxiliar vaya siempre ((un paso por detr´as)) de aux . Observa: E lista.c E 1 2 3

TipoLista borra_cola(TipoLista lista) { struct Nodo * aux , * atras ;

4

if (lista != NULL) { for ( atras = NULL, aux = lista; aux ->sig != NULL; atras = aux , aux = aux ->sig) ; free(aux ); ... }

5 6 7 8 9 10

}

F´ıjate en el nuevo aspecto del bucle for. Utilizamos una construcci´on sint´actica que a´ un no conoces, as´ı que nos detendremos brevemente para explicarla. Los bucles for permiten trabajar con m´as de una inicializaci´ on y con m´ as de una acci´on de paso a la siguiente iteraci´on. Este bucle, por ejemplo, trabaja con dos variables enteras, una que toma valores crecientes y otra que toma valores decrecientes: 1 2

for ( i=0 , j=10 ; i<3; i++ , j-- ) printf ("%d %d\n", i, j);

¡Ojo! Es un u ´nico bucle, no son dos bucles anidados. ¡No te confundas! Las diferentes inicializaciones y pasos de iteraci´ on se separan con comas. Al ejecutarlo, por pantalla aparecer´a esto: 0 10 1 9 2 8 Introducci´ on a la Programaci´ on con C

277

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c