Вопрос

Я пытаюсь создать односвязный список из входного текстового файла для назначения.Я пытаюсь делать это понемногу за раз, чтобы знать, что мой код неполон.Я попытался создать указатель head и просто распечатать его значение, и я даже не могу заставить это работать, но я не уверен, почему.Я включил функции struct, my create list и print list.Я не включил открытый файл, так как эта часть работает.

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. */
}
Это было полезно?

Решение

root имеет неопределенное значение, поэтому оно не будет инициализироваться.Вторая строка из CreateList должно быть

LIST *root = NULL;

Кроме того, далее, по-видимому, есть выделение для деталей элемента, но а) коду не удается захватить выделение и сохранить его где угодно, и б) размер выделения должен быть strSize, а не длина самой переменной.Есть несколько способов исправить это, но самым простым был бы:

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

Другие советы

Второй malloc выделяет память, но его возвращаемое значение ничему не присваивается, так что выделенная память теряется.

newList выделен, но не инициализирован, поэтому использование memcpy для копирования памяти в newList-> str завершится неудачей, поскольку newList->str ни на что не указывает.Вероятно, вы хотели, чтобы результат второго malloc был присвоен newList->str, но вы забыли об этом.

Вы не должны увеличивать head после head = head->next в цикле for.printList будет возвращать NULL каждый раз, так как цикл не остановится до тех пор, пока head не станет NULL.В любом случае, зачем вам нужно возвращать начало списка, которое вы только что передали функции?

Редактировать:

LIST *current = head;
while (current != NULL) {
    printf("%s    %d", current->str, current->count);
    current = current->next;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top