【问题标题】:Insert 2 values into a linked list node将 2 个值插入到链表节点中
【发布时间】:2014-11-01 17:30:35
【问题描述】:

我正在使用一个结构如下的链表:

struct theStruct{
    int variable1;
    char* variable2;
    struct theStruct* next;
};

如您所见,我想在每个节点中插入两个变量。我遇到的问题是我目前正在从文本文件中读取,变量 1 是在行的开头获得的,最后是变量 2,所以我无法同时将它们放入(至少不是我意识到)。我就是这样写的,但没有成功。

...
reading file
....
 while(token != NULL)
    {
        if(counter == 1)
        {
            newToken = token;
        }

        if(counter == 3)
        {
            temp = (theStruct*)malloc(sizeof(theStruct));
            temp->variable1= atoi(token);
            temp->variable2 = newToken;
            temp->next = head;
            head = temp;
        }
...

之后,当我尝试打印时,我只能从 temp->variable1 中获取值,而 temp->variable2 包含一些奇怪的字符。 我想以某种方式保留第一个变量,直到我得到另一个变量而不为 temp 分配新内存,但我不知道如何做到这一点。我希望我为你们提供了足够的信息,以便为我提供一些线索或线索来解决我的问题。

【问题讨论】:

  • 你能再贴一些代码吗?我猜令牌是文件内容,但我不明白你使用的是什么计数。您说 variable2 在行尾,但是当 count 为 1 时您正在为其分配令牌
  • 对不起,我忘了提,文件的每一行都有一个特定的模式,我需要在位置 1 和 3 上的变量。token 是我保存从 strtok 获得的值的名称跨度>

标签: c memory-management linked-list dynamic-memory-allocation


【解决方案1】:

当你说:

temp->variable2 = newToken;

您将temp->variable2 指向您第一次传递给strtok() 的任何内容的中间某处——这很可能会被覆盖。您可能想要复制它:

temp->variable2 = strdup(newToken);

这是一些人觉得 strtok() 充满危险的原因之一。

【讨论】:

  • 谢谢!它终于开始工作了,很抱歉一开始的描述不好。我想我再也不会犯这个错误了:)
【解决方案2】:

我假设您对文件中的多行执行此操作。 考虑一个这样的程序::

if open file fails die a horrible death
init linked list
while fgets from file a whole line != NULL {
    temp = malloc(sizeof(things));
    token = strtok(line, "!");
    while (token != NULL) {
        decide where to insert token in temp->XXXX
        token = strtok(NULL, "!");
    }
    insert temp into your linked list (probably)
}

【讨论】:

  • 这就是我正在做的事情,只是我在代码中的不同时间获取了 variable1 和 variable2,这不允许我为 temp 分配内存,因为它会在我重新分配的时候重新分配获取另一个变量
  • variable1 和 variable2 在同一行,对吧?
  • 是的,但是因为我使用的是 while 循环:while(token != NULL)
  • token 来自哪里?
  • token 是我用来保存文件中不同“单词”的变量,例如:food!sport!movies 等,然后我将食物保存在 token 中并使用 strtok 保存他们从彼此
猜你喜欢
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
  • 2018-04-19
  • 1970-01-01
  • 2020-02-18
相关资源
最近更新 更多