Pregunta

Estoy intentando crear una lista enlazada desde un archivo de texto de entrada para una asignación. Estoy tratando de hacerlo un poco a la vez, así que sé que mi código no es completa. He intentado crear el puntero de cabeza y simplemente imprimir su valor y ni siquiera puedo conseguir que funcione, pero no estoy seguro de por qué. Incluí la estructura, crear Mi lista, e imprimir las funciones de lista. No he incluido el archivo abierto ya que esa parte funciona.

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. */
}
¿Fue útil?

Solución

root tiene un valor indefinido, por lo que no se inicializará. La segunda línea de CreateList debería ser

LIST *root = NULL;

Además, más abajo hay asignación al parecer por los detalles del tema, pero a) el código no logra captar la asignación y guardarlo en cualquier lugar, y b) el tamaño de la asignación debe ser strSize, no la longitud de la propia variable. Hay varias maneras de solucionarlo, pero la más sencilla sería:

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

Otros consejos

El segundo Asigna memoria malloc, pero su valor de retorno no está asignado a nada, por lo que la memoria asignada se pierde.

newList está adjudicado, no inicializado, por lo que el uso de un establecimiento de memoria a la memoria copia a newList-> str fallará puntos desde newList-> str a nada. Probablemente quería que el resultado de la segunda malloc que se asignará a newList-> str, pero se le olvidó.

no se debe incrementar la cabeza después de head = head->next en el bucle. ImprimeLista devolverá NULL cada vez desde la parada de costumbre bucle hasta que la cabeza es NULL. ¿Por qué necesita para volver la cabeza de la lista que acaba de pasar a la función de todos modos?

Editar:

LIST *current = head;
while (current != NULL) {
    printf("%s    %d", current->str, current->count);
    current = current->next;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top