makigas - listas enlazadas en c insertar elementos
¿Cómo retroceder en una lista vinculada? (2)
Digamos que tengo la cadena "Lámparas", pasa a mi programa y cada personaje se almacena en un nodo en una lista vinculada.
Necesito copiar esa lista en orden inverso usando otra lista vinculada, ¿cómo hago esto? He llegado bastante lejos, pero ¿cómo retrocedo en la lista vinculada?
Verá la línea comentada sobre lo que necesito poner allí para retroceder en la lista vinculada.
#include <stdlib.h>
#include <stdio.h>
struct NODE {
struct NODE *next;
char data;
};
int main(int argc, char *argv[]) {
int i;
struct NODE *head;
struct NODE *current;
struct NODE *head2;
struct NODE *current2;
struct NODE *finger;
for(i = 0; i < argc; i++)
printf("arg %d: %s/n", i, argv[i]);
head = (struct NODE*)malloc(sizeof(struct NODE));
current = head;
for ( i = 0; i < sizeof(argv[1]) - 1; i++ ) {
current -> data = argv[1][i];
current -> next = (struct node*)malloc(sizeof(struct NODE));
current = current -> next;
current -> next = NULL;
}
head2 = (struct NODE*)malloc(sizeof(struct NODE));
current2 = head2;
while ( current != head) {
finger = head;
while (finger -> next != current)
finger = finger -> next;
current2 -> data = current -> data;
current2 -> next = (struct node*)malloc(sizeof(struct NODE));
current2 = current2 -> next;
// move backwards
} // ends loop
}
return 0;
}
¿Cómo retrocedo en la lista (individualmente) vinculada?
Tu no El truco para invertir una lista en otra es insertarla en la parte superior, y no en la parte posterior, de la lista de objetivos. Debe recorrer su lista original de la manera habitual siguiendo los next
punteros, pero en lugar de agregar elementos al final de la lista de objetivos, cree un nuevo nodo y reemplace el encabezado del objetivo con él.
Aquí hay una ilustración paso a paso:
sourceHead -> "A" -> "B" -> "C" -> NULL
your pointer ^
targetHead -> NULL
sourceHead -> "A" -> "B" -> "C" -> NULL
your pointer ^
targetHead -> "A" -> NULL
sourceHead -> "A" -> "B" -> "C" -> NULL
your pointer ^
targetHead -> "B" -> "A" -> NULL
sourceHead -> "A" -> "B" -> "C" -> NULL
your pointer ^
targetHead -> "C" -> "B" -> "A" -> NULL
La versión corta es para extender su estructura con una variable prev, cuando crea un niño que se asigna a su variable principal, y luego puede, desde el niño lee su variable principal para mover una hacia atrás - y recurse para obtener todo el camino a la cima.