Узлы связанного списка добавлены к тому же адресу - PullRequest
0 голосов
/ 19 октября 2019

Я читаю текстовый файл в UTF-8, используя fgetc и разделяя слова. Я сделал функцию добавления, чтобы добавить каждое слово в связанный список, но когда я распечатываю адрес слов, они все одинаковые, указывая, что они просто перезаписываются. Как правильно добавить данные в мой список?

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

struct node
{
    void *data;
    struct node *next;
};

Я набираю def для этого файла connected_list

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

void append(linked_list *list, void *word)
{

    if(list->data == NULL)
    {
        list->data = word;
        list->next = NULL;
                //printf("WORD: %s\n", (char *)list->data);
        //printf("ADDRESS %p\n", list->data);
    }
    else
    {
        linked_list *new_node;
        new_node = malloc(sizeof(linked_list));
        new_node->data = word;
        new_node->next = NULL;

        while(list->next != NULL)
        {
            if(list->next == NULL)
            {
                list->next = new_node;
            }

        }
                //printf("WORD: %s\n", (char *)list->data);
        //printf("ADDRESS %p\n", list->data);

    }

}

А вот моя функция печати

void print_list(linked_list *list) {

    if(list == NULL)
    {
        printf("Print: the list is empty!\n");
    }

    while (list != NULL) {
        printf("DATA %s\n", (char *)list->data);
        list = list->next;
    } 

}

Я ожидаю, что функция печати напечатает

'DATA the_word' для всех слов, но я получаю 'DATA �'

Печать в функции добавления дает:

WORD: The
ADDRESS 0x55b6fa2314b0

WORD: Project
ADDRESS 0x55b6fa2314b0

WORD: Gutenberg
ADDRESS 0x55b6fa2314b0

WORD: EBook
ADDRESS 0x55b6fa2314b0

WORD: of
ADDRESS 0x55b6fa2314b0

WORD: Pride
ADDRESS 0x55b6fa2314b0

WORD: and
ADDRESS 0x55b6fa2314b0

WORD: Prejudice,
ADDRESS 0x55b6fa2314b0

WORD: by
ADDRESS 0x55b6fa2314b0

WORD: Jane
ADDRESS 0x55b6fa2314b0

WORD: Austen
ADDRESS 0x55b6fa2314b0

Ответы [ 2 ]

0 голосов
/ 19 октября 2019

Есть много проблем с этой программой.

  1. Представление пустого списка. Похоже, вы выбрали представление пустого списка с фиктивным узлом без данных. Хотя это не является технически неправильным само по себе, это не самое интуитивное и понятное представление. Обычно пустой список представлен просто нулевым указателем. См. этот вопрос SO для получения дополнительной информации.
  2. Цикл сложения неправильный. Не ясно, как ваша функция может добавить более одного узла в список.

    while(list->next != NULL)
    {
        // at this point, list->next != NULL, by definition (see loop condition)
        if(list->next == NULL) // this is always false
        {
            list->next = new_node; // this is never executed
        }
        // the loop body doesn't modify anything
    }
    

    В другом ответе есть способ исправить это, я не буду повторять это здесь.

  3. И последнее, но не менее важное: ошибка, на которую вы жалуетесь, является результатом очень общего подводного камня .
0 голосов
/ 19 октября 2019

Проблема в этой части:

while(list->next != NULL)
{
    if(list->next == NULL)
    {
        list->next = new_node;
    }

}

Вы не переходите к следующему узлу и всегда находитесь в первом узле. Сделайте копию list (чтобы не изменять сам список) и выполните итерации по ней:

linked_list *copy = list;

while(copy->next != NULL)
{
    copy = copy->next;
}

copy->next = new_node;


...