Lista enlazada en C ¿Por qué mi variable de encabezado de lista sigue siendo nula (nueva en C)

Recibí una gran ayuda con mis otras preguntas en relación con este problema de la lista de enlaces. Mi problema actual ahora es que el encabezado de la lista sigue siendo nulo, por lo que no puedo vincular ninguno de los nodos ni imprimir nada en la consola.

El problema es la función insert_node, por lo que cuando se llama print, el bucle while no se ejecuta porque la cabeza es nula. Lo he superado a través del de bugger y es definitivamente nulo que tiene la dirección 0x0.

¿Es este otro tema de Malloc? No soy muy bueno en eso todavía.

código:

/* * File: main.c * Author: che16 * * Created on 20 November 2013, 08:59 */ #include  #include  #include  #include "structure.h" /* * */ node* head = NULL; int main(int argc, char** argv) { int no; printf("enter amount of books \n"); scanf("%d", &no); create_books(no); print_list(head); return (EXIT_SUCCESS); } node* create_books(int no_of_books) { char title[50]; char author[30]; unsigned int number; int i; for (i = 0; i btitle, title, 40); strncpy(new_node->name, author, 40); new_node->isbn = number; new_node->n = NULL; insert_node(head, new_node); } } void insert_node(node* head, node* insert) { printf("insert called \n"); insert->n = NULL; if (head == NULL) { head = insert; } else { node* curr = head; while (curr->n != NULL) { curr = curr->n; } curr->n = insert; } printf("finished called \n"); } void delete_node(node* head, node * node) { } void print_list(node * head) { while (head) { printf("%s: \"%s\" (%u)\n", head->btitle, head->name, head->isbn); head = head->n; } } 

SOLUCIÓN

 /* * File: main.c * Author: che16 * * Created on 20 November 2013, 08:59 */ #include  #include  #include  #include "structure.h" /* * */ node** head = NULL; int main(int argc, char** argv) { int no; printf("enter amount of books \n"); scanf("%d", &no); create_books(no); print_list(head); return (EXIT_SUCCESS); } node* create_books(int no_of_books) { char title[50]; char author[30]; unsigned int number; int i; for (i = 0; i btitle, title, 40); strncpy(new_node->name, author, 40); new_node->isbn = number; new_node->n = NULL; insert_node(&head, new_node); } } void insert_node(node** head, node* insert) { printf("insert called \n"); insert->n = NULL; if (*head == NULL) { *head = insert; } else { node* curr = *head; while (curr->n != NULL) { curr = curr->n; } curr->n = insert; } printf("finished called \n"); } void delete_node(node* head, node * node) { } void print_list(node * head) { while (head) { printf("%s: \"%s\" (%u)\n", head->btitle, head->name, head->isbn); head = head->n; } } 

El problema es que está pasando la head como una variable local a la función insert_node , en lugar de usar la global.

Tienes tres opciones aquí:

  1. Haga que todas sus funciones actúen sobre la head global y no las transfiera (no se recomienda);

  2. Pase la head como un node** , para que las funciones puedan cambiar el valor del node* que apunta;

  3. Use una estrategia de cabeza ficticia en la que la cabeza sea un nodo de lista vacía que nunca sea NULL y nunca cambie. Utiliza su next puntero como el encabezado de la lista real. Este enfoque tiende a hacer que todo el código de su lista sea mucho más simple a expensas de una pequeña pérdida de memoria.

Esto se debe a su función insert_node , donde establece la variable local head = insert; . La variable principal global permanece intacta. Debe cambiar su función de la siguiente manera: insert_node(node*& head, node* insert) . Con eso, pasas una referencia al jefe global.

Edición : sí, lo siento, en C no hay referencias. Así que vea la respuesta # 2 de Paddy …