Page 290

4.6 Listas con enlace simple

while y for Hemos dicho que el bucle for no resulta conveniente cuando queremos tener un gran control sobre los punteros auxiliares. No es cierto. El bucle for de C permite emular a cualquier bucle while. Aqu´ı tienes una versi´ on de borra_valor (eliminaci´ on de todos los nodos con un valor dado) que usa un bucle for: 1 2 3

TipoLista borra_valor (TipoLista lista, int valor ) { struct Nodo * aux , * atras;

4

for (atras = NULL, aux = lista; aux != NULL; ) { if (aux ->info == valor ) { if (atras == NULL) lista = aux ->sig; else atras->sig = aux ->sig; free(aux ); if (atras == NULL) aux = lista; else aux = atras->sig; } else { atras = aux ; aux = aux ->sig; } } return lista;

5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

}

Observa que en el bucle for hemos dejado en blanco la zona que indica c´ omo modificar los punteros aux y atras. Puede hacerse. De hecho, puedes dejar en blanco cualquiera de los componentes de un bucle for. Una alternativa a while (1), por ejemplo, es for (;;).

O sea, insertar en la posici´ on 0 es insertar una nueva cabeza; en la posici´on 1, un nuevo segundo nodo, etc. ¿Qu´e pasa si se quiere insertar un nodo en una posici´on mayor que la longitud de la lista? Lo insertaremos en u ´ltima posici´on. El prototipo de la funci´ on ser´ a: lista.h ... extern TipoLista inserta_en_posicion(TipoLista lista, int pos, int valor );

y aqu´ı tienes su implementaci´ on: lista.c 1 2 3 4

TipoLista inserta_en_posicion(TipoLista lista, int pos, int valor ) { struct Nodo * aux , * atras, * nuevo; int i;

5

nuevo = malloc(sizeof (struct Nodo)); nuevo->info = valor ;

6 7 8

for (i=0, atras=NULL, aux =lista; i < pos && aux != NULL; i++, atras = aux , aux = aux ->sig) ; nuevo->sig = aux ; if (atras == NULL) lista = nuevo; else atras->sig = nuevo; return lista;

9 10 11 12 13 14 15 16

}

284

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