Создание отдельно связанного списка в C

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

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. */
}
6
задан Bill the Lizard 16 December 2012 в 16:04
поделиться

3 ответа

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

LIST *root = NULL;

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

newList->str = (char *)malloc(strSize);
if (newList->str == NULL)
2
ответ дан 17 December 2019 в 07:03
поделиться

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

Edit:

LIST *current = head;
while (current != NULL) {
    printf("%s    %d", current->str, current->count);
    current = current->next;
}
1
ответ дан 17 December 2019 в 07:03
поделиться

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

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

1
ответ дан 17 December 2019 в 07:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: