Domanda

Sto cercando di creare una lista concatenata semplice da un file di testo di input per un incarico. Sto cercando di fare un po 'alla volta in modo che conosco il mio codice non è completa. Ho cercato di creare il puntatore di testa e basta stampare il suo valore e non riesco nemmeno a ottenere che al lavoro, ma non sono sicuro perché. Ho incluso lo struct, il mio creare lista, e lista di stampa. Non ho incluso il file aperto da quella parte funziona.

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. */
}
È stato utile?

Soluzione

root ha un valore indefinito, in modo che non verrà inizializzato. La seconda linea di CreateList deve essere

LIST *root = NULL;

Inoltre, più in basso c'è l'assegnazione a quanto pare per i dettagli della voce, ma a) il codice non riesce a catturare l'assegnazione e salvarlo ovunque, e b) la dimensione dello stanziamento dovrebbe essere strSize, non la lunghezza del variabile stessa. Ci sono diversi modi per risolvere il problema, ma il più semplice potrebbe essere:

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

Altri suggerimenti

Il secondo malloc alloca memoria ma il suo valore di ritorno non è assegnato a nulla, così che la memoria allocata viene persa.

newList assegnata ma non inizializzato, in modo da utilizzare un memcpy per copiare memoria newList-> str falliranno dal newList-> punti str a nulla. Probabilmente si voleva il risultato della seconda malloc da assegnare alla newList-> str, ma si è dimenticato di esso.

Non si dovrebbe incrementare testa dopo head = head->next nel ciclo for. StampaLista restituirà NULL ogni volta da quando il circuito non si fermerà fino a quando la testa è NULL. Perché è necessario restituire la testa della lista che avete appena passato alla funzione comunque?

Modifica:

LIST *current = head;
while (current != NULL) {
    printf("%s    %d", current->str, current->count);
    current = current->next;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top