Insertion du nœud dans la programmation C en premier lieu

Voici une fonction d’un programme que j’écris pour mieux me familiariser avec les nœuds. Je ne sais pas s’il est correct, mais essentiellement, il vérifie si le nœud est Null, si c’est le cas, puis ajoute les informations au champ de code et définit le pointeur sur NULL.

Sinon, il crée un nouveau nœud et insère les informations dans le champ de code, puis pointe vers le premier nœud existant. Je ne sais pas comment changer l’en-tête qui pointe vers le premier nœud d’origine pour pointer vers le nouveau nœud. Le code est

typedef struct node { LibraryCode location; struct node *next; } Node; void insertFirstNode(LibraryCode code, Node **listPtr) { Node *n=*listPtr; Node *first; if(n==NULL){ n=malloc(sizeof(Node)); n->location=code; n->next=NULL; } else { Node *first; first->location=code; first->next=n; } } 

Vous devez créer le nouveau nœud de manière inconditionnelle (et définir l’emplacement sur la nouvelle valeur).

S’il existe déjà une liste, vous souhaitez probablement insérer ce nœud au début de la liste et s’il n’y en a pas, il devient alors le premier nœud? Notez la fonction renommée; cela reflète le fait qu’un nœud sera toujours inséré.

Insérer à l’avant

 void insertNode(LibraryCode code, Node **listPtr) { Node *new_node = malloc(sizeof(*new_node)); if (new_node == 0) err_exit("Out of memory"); new_node->location = code; new_node->next = *listPtr; *listPtr = new_node; } 

Insérer à la fin

Si vous voulez insérer à la fin de la liste s’il y en a déjà une, alors:

 void insertNode(LibraryCode code, Node **listPtr) { Node *new_node = malloc(sizeof(*new_node)); if (new_node == 0) err_exit("Out of memory"); new_node->location = code; new_node->next = NULL; if (*listPtr == NULL) *listPtr = new_node; else { Node *node = *listPtr; while (node->next != NULL) node = node->next; node->next = new_node; } } 

Si vous souhaitez éviter une erreur si la liste est déjà allouée, vous devez repenser la conception de votre API.

Le ** listPtr est l’adresse contenant ou devant contenir le noeud principal de la liste. Si * listPtr == null alors la liste est vide, je présume que c’est la convention à en juger par ce qui est fourni. Dans tous les cas, nous devons créer un nouveau nœud pour le LibraryCode fourni. Donc, un peu raccourci (certaines erreurs de traitement non précisées) ..

 void insertFirstNode(LibraryCode code, Node **listPtr){ node = malloc( sizeof(Node) ); node->location = code; node->next = *listPtr; *listPtr = node; } 

En gros, vous avez deux options. Si le listPtr existant est null, alors vous avez une liste vide et il vous suffit de créer sa première entrée. Si listPtr n’est pas null, alors une liste existe déjà et vous devez simplement insérer un nouveau nœud au début de la liste.

Donc en code pseudo-ish:

 if (listptr == null) { ... empty chain, create one n = malloc(...); n->location = code; n->next = null; } else { ... got an existing chain n = malloc(...); n->location = code; n->next = listptr; // make previous top of chain be a child of new node} } return n;