Page 266

4.5 Introducci´ on a la gesti´ on de registros enlazados No debe sorprenderte el uso del operador -> en las asignaciones a campos del registro. La variable lista es de tipo struct Nodo *, es decir, es un puntero, y el operador -> permite acceder al campo de un registro apuntado por un puntero. He aqu´ı el resultado: info

lista

sig

8

Ya tenemos una lista con un u ´nico elemento. Vamos a a˜ nadir un nuevo nodo a la lista, uno que contenga el valor 3 y que ubicaremos justo al principio de la lista, delante del nodo que contiene el valor 8. O sea, partimos de esta situaci´on: info

lista

sig

8

y queremos llegar a esta otra: info

lista

sig

info

3

sig

8

En primer lugar, hemos de crear un nuevo nodo al que deber´a apuntar lista. El campo sig del nuevo nodo, por su parte, deber´ıa apuntar al nodo que contiene el valor 8. Empecemos por la petici´ on de un nuevo nodo que, ya que debe ser apuntado por lista, podemos pedir y rellenar as´ı: 1 2 3

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

4

... lista = malloc( sizeof (struct Nodo) ) ; lista->info = 3 ; lista->sig = ??? ; // No sabemos c´ omo expresar esta asignaci´ on. ...

5 6 7 8 9

¡Algo ha ido mal! ¿C´ omo podemos asignar a lista->sig la direcci´on del siguiente nodo con valor 8? La situaci´ on en la que nos encontramos se puede representar as´ı: info

sig

3

lista

info

sig

8

¡No somos capaces de acceder al nodo que contiene el valor 8! Es lo que denominamos una p´erdida de referencia, un grave error en nuestro programa que nos imposibilita seguir construyendo la lista. Si no podemos acceder a un bloque de memoria que hemos pedido con malloc, tampoco podremos liberarlo luego con free. Cuando se produce una p´erdida de referencia hay, pues, una fuga de memoria: pedimos memoria al ordenador y no somos capaces de liberarla cuando dejamos de necesitarla. Un programa con fugas de memoria corre el riesgo de consumir toda la memoria disponible en el ordenador. Hemos de estar siempre atentos para evitar p´erdidas de referencia. Es uno de los mayores peligros del trabajo con memoria din´amica. ¿C´omo podemos evitar la p´erdida de referencia? Muy f´acil: con un puntero auxiliar. 1 2 3

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

4 5 6 7 8 9 10

260

... aux = lista ; lista = malloc( sizeof (struct Nodo) ); lista->info = 3; lista->sig = aux ; ... Introducci´ on a la Programaci´ on con C

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement