¿Problemas para crear e iterar a través de la lista vinculada?

Cuando ejecuto el progtwig a continuación, imprime “one: 1”, en lugar de “one: 1, two: 2”, como esperaba. Alguien sabe lo que está pasando aquí? Estoy tratando de crear una función que me permita crear tantas listas enlazadas como sea posible en lugar de simplemente declarar cabezas globales.

struct Node { int value; char label[10]; node *next; }; typedef struct Node node; int add(int data, char name[], node *head) { node *newNode = (node *)malloc(sizeof(node)); if (newNode != NULL) { newNode->value = data; strcpy(newNode->label, name); newNode->next = head; head = newNode; } } node* createNewLinkedList(int d, char *name) { node *newNode = (node *)malloc(sizeof(node)); newNode->value = d; strcpy(newNode->label, name); newNode->next = NULL; return newNode; } int main() { node *head1 = createNewLinkedList(1, "one"); add(2, "two", head1); iterate(head1); } 

Estás pasando un puntero al nodo. Como todos los parámetros en C, se pasa por valor, por lo tanto head = newNode; no tiene efecto en la persona que llama.

Debe cambiar la firma para aceptar la node **head y agregar un nivel de direccionamiento indirecto para que los cambios en la add se reflejen en la main .

 int add(int data, char name[], node **head) { node *newNode = (node *)malloc(sizeof(node)); if (newNode != NULL) { newNode->value = data; strcpy(newNode->label, name); newNode->next = *head; *head = newNode; } } 

Por supuesto, deberá pasar &head1 al método add(2, "two", &head1); : add(2, "two", &head1);

PS Ya que está agregando {2, “dos”} al frente de la lista, su salida será “dos: 2, uno: 1”

head = newNode; No haré lo que esperas.

La cabeza es pasar-por-valor aquí. Piénsalo.

Además, no está conectando el nuevo nodo al final de su lista, simplemente está creando un nuevo nodo que está completamente desconectado de su lista real. Tampoco devuelve un int de esa función según la firma de la función.

Sospecho que desea establecer el nuevo nodo como la cabeza con esta línea:

 head = newNode; 

Si ese es el caso, cambie head por type node** y haga *head = newNode ; de lo contrario, solo está modificando una variable local para que apunte a newNode , no el puntero head1 se pasa de main . En main deberías entonces pasar &head1 para add .

EDIT: Lo que probablemente tendría más sentido es tener head->next = newNode; , o para iterar hasta el final de la lista y establecer el next valor del nodo que apunta a NULL a newNode . es decir.

 node *lastNode = head; while (lastNode->next != NULL) /* get to the last node in the list */ lastNode = lastNode->next; lastNode->next = newNode; /* add newNode to the end of the list */ 

También tenga newNode->next = NULL lugar de newNode->next = head . Ahora la salida será "one : 1, two: 2" , en lugar de "two: 2, one : 1" que habría ocurrido si hubiera agregado el newNode a la cabeza.

Sin ver su function iteración function el problema es que head1 está apuntando al último elemento de la lista, no al primero. Probablemente quiso decir que la última línea de la función agregar es:

 return head; 

y 2da línea de su progtwig para ser:

 head1 = add(2, "two", head1); 

Pero eso probablemente le dará su salida en el orden incorrecto, porque su función de add está agregando el nuevo elemento al principio de la lista, no al final.

Para comprender el problema en detalle, consulte The C Programming Language de Kernighan & Ritchie : Introducción (capítulo 1.7 / 1.8) y Funciones y estructura del progtwig (capítulo 4).

Sugerencia: pass-by-value y pass-by-address

 int main() { ... add(2, "two", &head1); ... } 

OTOH, debe validar la dirección de retorno de malloc antes de createNewLinkedList referencia (en createNewLinkedList ).