Création d’une liste à liens simples en C

J’essaie de créer une liste à lien unique à partir d’un fichier texte d’entrée pour une affectation. J’essaie de le faire un peu à la fois pour que je sache que mon code n’est pas complet. J’ai essayé de créer le pointeur principal et d’imprimer sa valeur. Je ne peux même pas le faire fonctionner, mais je ne sais pas pourquoi. J’ai inclus les fonctions struct, create list et print list. Je n’ai pas inclus le fichier ouvert car cette partie fonctionne.

typedef struct List { struct List *next; /* pointer to the next list node */ char *str; /* pointer to the ssortingng represented */ int count; /* # of occurrences of this ssortingng */ } LIST; LIST *CreateList(FILE *fp) { char input[LINE_LEN]; LIST *root; /* contains root of list */ size_t strSize; LIST *newList; /* used to allocate new list members */ while (fscanf(fp, BUFFMT"s", input) != EOF) { strSize = strlen(input) + 1; /* create root node if no current root node */ if (root == NULL) { if ((newList = (LIST *)malloc(sizeof(LIST))) == NULL) { printf("Out of memory..."); exit(EXIT_FAILURE); } if ((char *)malloc(sizeof(strSize)) == NULL) { printf("Not enough memory for %s", input); exit(EXIT_FAILURE); } memcpy(newList->str, input, strSize); /*copy ssortingng */ newList->count = START_COUNT; newList->next = NULL; root = newList; } } return root; } /* Prints sinly linked list and returns head pointer */ LIST *PrintList(const LIST *head) { int count; for (count = 1; head != NULL; head = head->next, head++) { printf("%s %d", head->str, head->count); } return head; /* does this actually return the start of head ptr, b/c I want to return the start of the head ptr. */ } 

root a une valeur indéfinie, il ne s’initialisera donc pas. La deuxième ligne de CreateList devrait être

 LIST *root = NULL; 

En outre, une atsortingbution semble plus détaillée pour les détails de l’élément, mais a) le code ne parvient pas à capturer l’allocation ni à l’enregistrer où que ce soit et b) la taille de l’allocation doit être strSize et non la longueur de la variable elle-même. Il existe plusieurs façons de résoudre ce problème, mais le plus simple serait:

 newList->str = (char *)malloc(strSize); if (newList->str == NULL) 

Le second malloc alloue de la mémoire mais sa valeur de retour n’est affectée à rien, de sorte que la mémoire allouée est perdue.

newList étant alloué mais non initialisé, l’utilisation d’un memcpy pour copier de la mémoire dans newList-> str échouera puisque newList-> str ne pointe pas vers rien. Vous vouliez probablement que le résultat du deuxième malloc soit affecté à newList-> str, mais vous l’avez oublié.

Vous ne devriez pas incrémenter tête après head = head->next dans la boucle for. PrintList retournera NULL à chaque fois puisque la boucle ne s’arrêtera pas jusqu’à ce que head soit à NULL. Pourquoi devez-vous quand même renvoyer la tête de la liste que vous venez de transmettre à la fonction?

Modifier:

 LIST *current = head; while (current != NULL) { printf("%s %d", current->str, current->count); current = current->next; }