In der Funktion wird die lokale Variable head
dem neu erstellten Knoten zugewiesen. Nach dem Verlassen der Funktion wird diese lokale Variable zerstört und die ursprüngliche Liste wird nicht geändert.
Darüber hinaus diese Schleife
while (head != NULL)
{
head = head->link;
}
macht keinen Sinn. Tatsächlich kann es
head = NULL;
ersetzt werden Die Funktion kann aussehen, wie es in dem folgenden demonstrativen Programm gezeigt wird.
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *link;
};
int insert(struct node **head, int value)
{
struct node *tmp = malloc(sizeof(struct node));
int success = tmp != NULL;
if (success)
{
tmp->data = value;
tmp->link = NULL;
while (*head) head = &(*head)->link;
*head = tmp;
}
return success;
}
void display(struct node*head)
{
for (; head != NULL; head = head->link) printf(" %d", head->data);
}
int main(void)
{
const int N = 10;
struct node *head = NULL;
int i = 0;
while (i < N && insert(&head, i)) i++;
display(head);
return 0;
}
Sein Ausgang ist
0 1 2 3 4 5 6 7 8 9
Wie die Liste wissen über das neue Element soll? Sie müssten das Element "link" des letzten Elements in der Liste so einstellen, dass es auf das neue Element verweist. Sobald "head" zu NULL wird, haben Sie das Element verloren, dessen "link" -Member Sie festlegen müssen. Eine bessere Schleifenbeendigungsbedingung wäre 'while (head-> link! = NULL)' – enhzflep
Ich schlage vor, du bewegst nie deinen 'Kopf', da es nicht empfohlen wird !! Es ist ein Referenzzeiger, der immer auf den Startknoten in der verknüpften Liste zeigen sollte. Verwenden Sie stattdessen einen anderen Zeiger. –