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. */
}
Était-ce utile?

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top