Page 285

4 Estructuras de datos: memoria din´amica

CC 2003, 2008 Andr´ es Marzal e Isabel Gracia

Ahora se libera el nodo apuntado por aux : aux

atras

lista Y, finalmente, hacemos que atras->sig sea igual NULL. Pero, ¡eso es imposible! El puntero atras apunta a NULL, y hemos dicho ya que NULL no es un nodo y, por tanto, no tiene campo alguno. Tratemos este caso como un caso especial. En primer lugar, ¿c´omo podemos detectarlo? Viendo si atras vale NULL. ¿Y qu´e hemos de hacer entonces? Hemos de hacer que lista pase a valer NULL, sin m´ as. lista.c 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 ); if (atras == NULL) lista = NULL; else atras->sig = NULL; } return lista;

5 6 7 8 9 10 11 12 13 14

}

Ya est´a. Si aplic´ asemos este nuevo m´etodo, nuestro ejemplo concluir´ıa as´ı: aux

atras

lista Hemos aprendido una lecci´ on: otro caso especial que conviene estudiar expl´ıcitamente es el de la lista compuesta por un solo elemento. Insistimos en que debes seguir una sencilla regla en el dise˜ no de funciones con punteros: si accedes a un campo de un puntero ptr , por ejemplo, ptr ->sig o ptr ->info, preg´ untate siempre si cabe alguna posibilidad de que ptr sea NULL; si es as´ı, tienes un problema que debes solucionar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · 256 ¿Funcionan correctamente las funciones que hemos definido antes (c´alculo de la longitud, inserci´ on por cabeza y por cola y borrado de cabeza) cuando se suministra una lista compuesta por un u ´nico elemento? .............................................................................................

4.6.9.

B´ usqueda de un elemento

Vamos a dise˜ nar ahora una funci´ on que no modifica la lista. Se trata de una funci´on que nos indica si un valor entero pertenece a la lista o no. El prototipo de la funci´on ser´a ´este: lista.h ... extern int pertenece(TipoLista lista, int valor );

La funci´on devolver´ a 1 si valor est´ a en la lista y 0 en caso contrario. ¿Qu´e aproximaci´ on seguiremos? Pues la misma que segu´ıamos con los vectores: recorrer cada uno de sus elementos y, si encontramos uno con el valor buscado, devolver inmediatamente el valor 1; si llegamos al final de la lista, ser´a que no lo hemos encontrado, as´ı que en tal caso devolveremos el valor 0. Introducci´ on a la Programaci´ on con C

279

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement