Page 281

4 Estructuras de datos: memoria din´amica

CC 2003, 2008 Andr´ es Marzal e Isabel Gracia

lista.c 1 2 3

TipoLista inserta_por_cola(TipoLista lista, int valor ) { struct Nodo * aux , * nuevo;

4

nuevo = malloc(sizeof (struct Nodo)); nuevo->info = valor ; nuevo->sig = NULL; if (lista == NULL) lista = nuevo; else { for (aux = lista; aux ->sig != NULL; aux = aux ->sig) ; aux ->sig = nuevo; } return lista;

5 6 7 8 9 10 11 12 13 14 15

}

Mejor as´ı.

4.6.7.

Borrado de la cabeza

La funci´on que vamos a dise˜ nar ahora recibe una lista y devuelve esa misma lista sin el nodo que ocupaba inicialmente la posici´ on de cabeza. El prototipo ser´a ´este: lista.h ... extern TipoLista borra_cabeza(TipoLista lista);

Implement´emosla. No podemos hacer simplemente lista = lista->sig. Ciertamente, ello conseguir´ıa que, en principio, los nodos que ((cuelgan)) de lista formaran una lista correcta, pero estar´ıamos provocando una fuga de memoria al no liberar con free el nodo de la cabeza (ya lo vimos cuando introdujimos las listas enlazadas): lista

info

sig

info

3

sig

8

info

sig

2

Tampoco podemos empezar haciendo free(lista) para liberar el primer nodo, pues entonces perder´ıamos la referencia al resto de nodos. La memoria quedar´ıa as´ı: lista

info

sig

info

3

sig

8

info

sig

2

¿Qui´en apuntar´ıa entonces al primer nodo de la lista? La soluci´ on requiere utilizar un puntero auxiliar: E lista.c E 1 2 3

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

4

aux = lista->sig; free(lista); lista = aux ; return lista;

5 6 7 8 9

}

Ahora s´ı, ¿no? No. Falla en el caso de que lista valga NULL, es decir, cuando nos pasan una lista vac´ıa. La asignaci´ on aux = lista->sig es err´onea si lista es NULL. Pero la soluci´on es muy sencilla en este caso: si nos piden borrar el nodo de cabeza de una lista vac´ıa, ¿qu´e hemos de hacer? ¡Absolutamente nada!: lista.c 1 2

TipoLista borra_cabeza(TipoLista lista) {

Introducci´ on a la Programaci´ on con C

275

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement