Page 268

4.5 Introducci´ on a la gesti´ on de registros enlazados

1 2 3

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

4

... aux = malloc( sizeof (struct Nodo) ) ; lista->sig->sig = aux ; aux ->info = 2 ; aux ->sig = NULL ;

5 6 7 8 9 10

return 0;

11 12

}

Veamos c´ omo queda la memoria paso a paso. Tras ejecutar la l´ınea 6 tenemos: aux lista

info

sig

info

sig

info

3

sig

8

O sea, la lista que ((cuelga)) de lista sigue igual, pero ahora aux apunta a un nuevo nodo. Pasemos a estudiar la l´ınea 7, que parece complicada porque contiene varias aplicaciones del operador ->. Esa l´ınea reza as´ı: lista->sig->sig = aux . Vamos a ver qu´e significa ley´endola de izquierda a derecha. Si lista es un puntero, y lista->sig es el campo sig del primer nodo, que es otro puntero, entonces lista->sig->sig es el campo sig del segundo nodo, que es otro puntero. Si a ese puntero le asignamos aux , el campo sig del segundo nodo apunta a donde apuntar´a aux . Aqu´ı tienes el resultado: aux

lista

info

sig

info

sig

info

3

sig

8

A´ un no hemos acabado. Una vez hayamos ejecutado las l´ıneas 8 y 9, el trabajo estar´a completo: info

aux

sig

2

info

lista

sig

info

sig

8

3

¿Y es ´eso lo que busc´ abamos? S´ı. Reordenemos gr´aficamente los diferentes componentes para que su disposici´ on en la imagen se asemeje m´as a lo que esper´abamos: aux lista

info

3

sig

info

8

sig

info

sig

2

Ahora queda m´ as claro que, efectivamente, hemos conseguido el objetivo. Esta figura y la anterior son absolutamente equivalentes. A´ un hay algo en nuestro programa poco elegante: la asignaci´on ((lista->sig->sig = aux )) es complicada de entender y da pie a un m´etodo de adici´on por el final muy poco ((extensible)). ¿Qu´e queremos decir con esto u ´ltimo? Que si ahora queremos a˜ nadir a la lista de 3 nodos un cuarto nodo, tendremos que hacer ((lista->sig->sig->sig = aux )). Y si quisi´eramos a˜ nadir un quinto, ((lista->sig->sig->sig->sig = aux )) Imagina que la lista tiene 100 o 200 elementos. ¡Menuda complicaci´ on proceder as´ı para a˜ nadir por el final! ¿No podemos expresar la idea ((a˜ nadir por el final)) de un modo m´ as elegante y general? S´ı. Podemos hacer lo siguiente: 262

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