Création d'une liste chaînée en C
-
22-09-2019 - |
Question
Je suis en train de créer une liste chaînée à partir d'un fichier texte d'entrée pour une affectation. Je suis en train de le faire un peu à un moment, donc je sais que mon code est incomplet. J'ai essayé de créer le pointeur de la tête et l'impression juste sa valeur et je ne peux même pas que travailler, mais je ne sais pas pourquoi. J'inclus le struct, ma création d'une liste, et les fonctions de la liste d'impression. Je ne comprenaient pas le dossier ouvert depuis cette partie fonctionne.
typedef struct List
{
struct List *next; /* pointer to the next list node */
char *str; /* pointer to the string represented */
int count; /* # of occurrences of this string */
} 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 string */
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. */
}
La solution
root
a une valeur non définie, de sorte qu'il ne sera pas initialiser. La deuxième ligne de CreateList
doit être
LIST *root = NULL;
En outre, plus bas il y a allocation apparemment pour les détails de l'élément, mais a) le code ne saisit pas l'allocation et l'enregistrer partout, et b) la taille de l'allocation devrait être strSize
, pas la longueur de la variable elle-même. Il y a plusieurs façons de le fixer, mais le plus simple serait:
newList->str = (char *)malloc(strSize);
if (newList->str == NULL)
Autres conseils
La seconde malloc alloue de la mémoire, mais sa valeur de retour n'est pas affectée à quoi que ce soit, de sorte que la mémoire allouée est perdue.
newList est affecté, mais pas initialisé, donc l'utilisation d'un memcpy pour copier la mémoire à newList-> str échouera depuis newList-> les points str à rien. Probablement que vous vouliez le résultat de la deuxième malloc à attribuer à newList-> str, mais vous l'avez oublié.
Vous ne devriez pas être tête incrémentez après head = head->next
dans la boucle. PrintList retournera NULL chaque fois depuis la boucle jusqu'à ce que wont stop tête est NULL. Pourquoi avez-vous besoin de retourner la tête de la liste que vous venez de passer à la fonction de toute façon?
Edit:
LIST *current = head;
while (current != NULL) {
printf("%s %d", current->str, current->count);
current = current->next;
}