Lista enlazada individualmente – C

Tengo una pregunta realmente rápida sobre listas enlazadas individualmente, a las que no pude encontrar la respuesta en otras preguntas.

Este es mi código:

#include  #include  void add(int data); void printList(); struct node { int data; struct node * link; }; struct node * head = NULL; main() { char c; while ((c = getchar()) != 'q') { if (c == 'a') { int temp; printf("data: "); scanf("%d", &temp); add(temp); } if (c == 'p') printList(); } } void add(int data) { struct node * temp = (struct node *) malloc(sizeof(struct node)); if (temp == NULL) fprintf(stderr, "error"); temp->link = head; temp->data = data; head = temp; } void printList() { struct node * temp = (struct node *) malloc(sizeof(struct node)); if (temp == NULL) fprintf(stderr, "error"); temp = head; while (temp != NULL) { printf("%d", temp->data); temp = temp->link; } } 

Ahora, me han dicho que necesito crear una función o un escenario dentro de mi función de adición que haga algo diferente si se crea una nueva lista. En otras palabras, cuando la lista está vacía y el primer elemento se le agrega, debe hacerse de manera diferente a cuando una lista llena recibe otro nodo en la parte frontal. Encontré un ejemplo de tal código en línea:

 # // Adding a Node at the Beginning of the List # # void addBeg(int num) # { # struct Node *temp; # # temp=(struct Node *)malloc(sizeof(struct Node)); # temp->Data = num; # # if (Head == NULL) # { # //List is Empty # Head=temp; # Head->Next=NULL; # } # else # { # temp->Next=Head; # Head=temp; # } # } 

Como notará, si la lista está vacía, se rellena el nodo principal.

Mi código funciona bien, pero me pregunto si estoy pasando por alto algo con respecto al manejo de la situación de cabeza nula.

¡Muchas gracias!

No hay nada fundamentalmente incorrecto en tu función add() . El caso donde la head == NULL no necesita un tratamiento especial.

Como otros lo han notado, su comprobación de errores no es correcta porque necesita regresar de la función en caso de que malloc falle. En su estado actual, la función add() lleva a cabo bashs de asignación a *temp cuando temp es NULL .

El código que mostró con ese tratamiento especial es falso. La cláusula else en ese código funciona perfectamente cuando head == NULL .

Puede elegir entre comprobar si el puntero en la cabeza es nulo cada vez que lo usa o puede suponer que no lo es si ha tratado el nodo principal de manera diferente.

Los buenos modales suponen que debería verificarlo siempre, pero si no marca y no elimina los punteros nulos, su código funcionará de todos modos.

Ya que siempre correrás la línea (cuando agregues un nodo)

 head = temp; 

Nunca tendrá una referencia NULA en su nodo principal después de haber agregado el nodo. Esto se debe a que verifica arriba (temp! = Null) que temp no es un puntero nulo.

Ahora, cuando busque un nodo, sería una muy buena idea verificar que el nodo principal no sea nulo antes de acceder a los campos en lo que sea (no) al que apunta. Tal vez eso es lo que se quería decir en las “condiciones especiales” y las notas se mezclaron con este caso donde generalmente no es necesario.

Si considera addBeg si se ramifica:

 if (Head == NULL) { Head=temp; Head->Next=NULL; } else { Head=temp; temp->Next=Head; } 

verá que está asignando temp a head y luego configurando el next puntero. Su implementación es, por otro lado:

 temp->link = head; temp->data = data; head = temp; 

y si omite la parte de data (y head = temp que está presente en ambos casos), verá fácilmente que es equivalente a la primera, porque

 temp->link = head; 

es lo mismo que:

 if (Head == NULL) { Head->Next=NULL; } else { temp->Next=Head; }