【问题标题】:How to load strings from a file into a Linked List in C?如何将文件中的字符串加载到C中的链接列表中?
【发布时间】:2021-05-25 07:17:44
【问题描述】:

...我对使用堆栈溢出比较陌生,所以如果这篇文章有什么问题,请随时告诉我。

我正在尝试将一个名为 dict 的文件中的几个单词加载到一个链接列表中。当我手动尝试打印出我加载的单词时,它只会打印出最后一个单词很多次。有人看到我在这里做错了吗?

CELL* head = malloc(sizeof(CELL));
CELL* ptr;

while (fscanf(dict, "%s", buffer) != EOF)
{
    ptr = malloc(sizeof(CELL));
    ptr->word = buffer;
    ptr->next = NULL;

    ptr->next = head;
    head = ptr;
}

CELL *tmp;
printf("%s", head->word);
printf("%s", head->next->word);
printf("%s", head->next->next->word);

【问题讨论】:

  • 看起来你一直在为列表的每个元素使用相同的单词缓冲区。因此,您的所有元素都指向一个缓冲区,该缓冲区保存您读取的最后一个单词。您需要为每个单词分配一个新的单词缓冲区。你的循环还有其他特殊的东西。您设置了ptr->next = NULL;,然后立即再次设置ptr->next = head;。您在开头分配的初始head 也未使用并丢失。我建议您更仔细地考虑您的代码。边做边准备好老式的铅笔和纸,然后画出你的数据和它发生了什么。

标签: c pointers linked-list scanf


【解决方案1】:

您将每个节点都指向缓冲区。您需要制作一份副本。

你可能想替换这一行

ptr->word = buffer;

这两个:

    ptr->word = malloc(strlen(buffer) + 1);
    strcpy(ptr->word, buffer);

如 cmets 中所述,列表的最后一个元素不会指向 NULL,它将是 CELL* head = malloc(sizeof(CELL)); 返回的内存中的任何值。

您可以将 head 初始化为 NULL 并删除行 ptr->next = NULL; 来解决这个问题。

【讨论】:

  • 或者干脆ptr->word = strdup(buffer);
【解决方案2】:

这里的问题是您覆盖了 head 中的数据及其自身的自引用

让我们假设文件的内容如下

嗨,你好吗?

head 在第一次通过时是空的,当它进入循环并且 ptr 将单词作为“Hi”时,您将 next 设置为 null 完成后,您将指向头部。但是然后你用 ptr 覆盖了头部,所以它的自我引用本身 它会被覆盖。

正如变量名所暗示的,head 应该是使用 next 指向链表中的下一项的一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-21
    • 2022-01-21
    • 1970-01-01
    • 2011-12-12
    • 2011-02-04
    • 2020-04-15
    • 2016-12-01
    • 2017-01-17
    相关资源
    最近更新 更多