Implémentation de la liste chaînée en C

Je suis nouveau sur les liens et j’essaye d’implémenter une liste liée en C. Ci-dessous dans mon code: –

#include #include struct node { int data; struct node *next; }; void insert (struct node *head, int data); void print (struct node *head); int main() { struct node *head ; head= NULL; printf("new\n"); insert(head,5); printf("%d\n",head); insert(head,4); insert(head,6); print(head); print(head); print(head); } void insert(struct node *head,int data){ printf("%d\n",head); if(head == NULL){ head =malloc(sizeof(struct node)); head->next = NULL; head->data = data; } else { printf("entered else\n"); struct node *tmp = head; if(tmp->next!=NULL){ tmp = tmp->next; } tmp->next = malloc(sizeof(struct node)); tmp->next->next = NULL; tmp->next->data = data; } } void print (struct node *head) { printf("%d\n",head); struct node *tmp = head; if (head == NULL) { printf("entered null\n"); return; } while (tmp != NULL) { if (tmp->next == NULL) { printf("%0d", tmp->data); } else { printf("%0d -> ", tmp->data); } tmp = tmp->next; } printf("\n"); } 

Quand je lance ce code la sortie est: –

 new 0 0 0 0 0 entered null 0 entered null 0 entered null 

La tête est toujours nulle et ne met pas à jour la valeur nulle. Il n’entre pas dans la boucle else en insertion. Quelqu’un peut-il m’aider à résoudre ce problème s’il vous plaît. Soulignez l’erreur que je fais. Merci

Il peut y avoir d’autres erreurs dans votre code, mais l’un des gros problèmes est que vous essayez de définir un nœud principal dans insert , mais cela n’affecte que la copie locale du pointeur transféré. Par conséquent, cela n’a aucun effet du côté de l’appelant:

 void insert(struct node *head,int data){ .... head = malloc(sizeof(struct node)); // head is local, caller won't see this 

Vous devez également vous assurer que lorsque vous transmettez un nœud qui n’est pas NULL , vous attachez réellement le nouveau nœud à la tête. Vous pouvez résoudre le premier problème en passant un pointeur à un pointeur ou en renvoyant le pointeur défini. Par exemple,

 void insert(struct node **head, int data) { if(*head == NULL) { // create the head node ... *head = malloc(sizeof(struct node)); .... else { // create a new node and attach it to the head struct node* tmp = malloc(sizeof(struct node)); .... (*head)->next = tmp; } } 

Ensuite, dans l’ main , vous devez passer un pointeur sur le pointeur principal, c’est-à-dire utiliser l’opérateur address-of & :

 struct node *head = NULL; insert(&head, 5); 

Notez qu’une partie du problème est que la fonction essaie de faire trop. Il s’appelle insert , mais il tente de créer un nouveau nœud si le pointeur transmis est NULL . Il serait préférable de séparer ces responsabilités:

 // allocate a node and set its data field struct node* create_node(int data) { struct node* n = malloc(sizeof(struct node)); n->next = NULL; n->data = data; return n; } // create a node and add to end node. // return the new end node. // end has to point to a valid node object. struct node* append_node(struct node* tail, int node_data) { struct node* new_tail = create_node(node_data); tail->next = new_tail; return new_tail; } 

J’ai corrigé votre fonction d’ insert :

 #include #include struct node { int data; struct node *next; }; #define CREATENODE malloc(sizeof(struct node)) void insert (struct node *head, int data); void print (struct node *head); int main() { struct node *head ; head = CREATENODE; printf("new\n"); insert(head,5); insert(head,4); insert(head,6); print(head); print(head); print(head); } void insert(struct node *head,int data){ struct node *temp, *nn; for(temp=head;temp->next!=NULL;temp=temp->next); nn=CREATENODE; nn->data = data; nn->next =temp->next; temp->next = nn; } void print (struct node *head) { struct node *tmp = head->next; if (head == NULL) { printf("entered null\n"); return; } while (tmp != NULL) { if (tmp->next == NULL) { printf("%0d", tmp->data); } else { printf("%0d -> ", tmp->data); } tmp = tmp->next; } printf("\n"); } 

void insert (struct node & head, int data) {// référence de passage plutôt que pointeur ^ Vous avez passé un pointeur, mais cela ne vous permettra que de changer les données pointées. Pour changer le pointeur lui-même, vous devez passer une référence. Pas sûr que mon C ne soit pas un peu rouillé, mais je vous pointe dans la bonne direction …

Cordialement,

André