C Simple LinkedList

J’ai examiné de nombreuses questions en ligne et je ne peux pas comprendre ce que je fais de travers. Je vais peut-être dans la mauvaise direction maintenant parce que j’ai essayé beaucoup de choses différentes.

J’essaie juste de faire une simple liste liée en C. Je n’arrive pas à comprendre comment faire en sorte que la liste rest connectée.

La structure pour mon nœud

typedef struct node { double x; // x-coordinate of this point in the tour double y; // y-coordinate of this point in the tour struct node* next; // Pointer to the next node in the linked list } Node; 

Ceci est mon code pour faire la liste, je construis un nœud vide en premier = NULL dans main

 Node* addFront(Node* first, double x, double y) { first = malloc(sizeof(Node)); if (first == NULL) { first->x = x; first->y = y; first->next = NULL; } else { Node * temp = malloc(sizeof(Node)); temp->x = x; temp->y = y; temp->next = first; first = temp; } //Temp testing int size = 0; Node * current = first; while (current->next != NULL) { printf("(%.4f, %.4f)\n", current->x, current->y); current = current -> next; size++; } printf("Size: %d\n", size); return first; } 

Quelques notes:

Vérifier si le premier est nul devrait être inutile … La liste devrait pouvoir être construite en utilisant simplement l’instruction else. (Ce que je pense)

Après l’ajout de l’instruction if / else, j’obtiens ce qui semble être une boucle infinie avec C qui pointe juste en mémoire aléatoire et qui conduit finalement à une erreur de segmentation.

Je ne sais tout simplement pas vers qui se tourner. Merci beaucoup à l’avance!

Ce bloc n’a pas de sens du tout:

  first = malloc(sizeof(Node)); if (first == NULL) { first->x = x; first->y = y; first->next = NULL; } 

Vous vouliez probablement déplacer le first = malloc(sizeof(Node)); à l’intérieur du bloc. Cela fonctionnerait, mais c’est totalement inutile car ce serait logiquement égal au bloc else . Donc, vous pouvez laisser juste le deuxième bloc là:

  Node * temp = malloc(sizeof(Node)); temp->x = x; temp->y = y; temp->next = first; first = temp; return first; // or rather return temp directly 

Il y a un autre point – vous devez append la gestion des erreurs au cas où malloc manque de mémoire, vous devriez donc vérifier temp == NULL et agir en conséquence (renvoyer NULL depuis function ou autre …).

Pour commencer, même la première déclaration de la fonction est fausse car la valeur du paramètre en first est écrasée.

 Node* addFront(Node* first, double x, double y) { first = malloc(sizeof(Node)); //... 

La fonction peut avoir l’aspect suivant

 Node * addFront( Node *first, double x, double y ) { Node *temp = malloc( sizeof( Node ) ); if ( temp != NULL ) { temp->x = x; temp->y = y; temp->next = first; first = temp; } return first; } 

Ou avec un code de test

 Node * addFront( Node *first, double x, double y ) { Node *temp = malloc( sizeof( Node ) ); if ( temp != NULL ) { temp->x = x; temp->y = y; temp->next = first; first = temp; } // start pf inline test size_t size = 0; for ( Node *current = first; current != NULL; current = current->next ) { printf( "(%.4f, %.4f)\n", current->x, current->y ); ++size; } printf( "Size: %zu\n", size ); // end pf inline test return first; }