【问题标题】:Why does modifying an unrelated variable cause a change in my linked list?为什么修改不相关的变量会导致我的链表发生变化?
【发布时间】:2016-12-01 04:56:55
【问题描述】:

我试图让我的链表在最简单的级别上工作。我想在我定义的链表(wordList)中添加一个新节点(变量wordNode)。在我的主 C 文件中,我创建了一个新列表 (createWordList),并在其中添加了一个节点,其中包含 inputLine 中的单词“Hello”。

问题在于,当我尝试打印列表头部的单词时,对输入行所做的任何更改都会被打印出来。例如,这里不会打印“Hello” , "Go" 被打印出来。我不明白这是怎么可能的,因为输入行完全没有链接到哈希表; “Go”这个词不应该影响哈希表中的值,对吧?下面是main函数的代码。

struct wordList* hashTable;
hashTable = createWordList();

char inputLine [20];

// set input line to Hello
strcpy (inputLine, "Hello");

// add Hello as the head node to the linked list
addWordNode (hashTable, inputLine);

// set input line to Go
strcpy (inputLine, "Go");

// print the head of the list. this is currently printing Go, instead of Hello.
if (hashTable->head != NULL) {
  printf ("%s\n", i, hashTable->head->word);
}

这里是 createWordList() 函数的代码:

struct wordList* createWordList() {
  struct wordList* list = malloc(sizeof(struct wordList));
  list->head = NULL;
  return list;
}

对于 addWordNode() 函数:

void addWordNode(struct wordList *list, char * word) {
  struct wordNode* currentNode;
  struct wordNode* newNode = malloc (sizeof(struct wordNode));
  newNode -> word = word;
  newNode -> docFrequency = 1;
  newNode -> next = NULL;

  // I've only included the first case, because that is what is setting the head value.

  if (list->head == NULL) {
    list->head = newNode;
    return;
  }

我很抱歉要求直接调试,但我已经做了好几个小时了。是否存在我不理解的更大的字符串或字符串操作行为?或者那里有一个简单的错误?

【问题讨论】:

  • “因为输入行完全没有链接到哈希表”?恰恰相反,在您的 addWordNode 函数中,您将新节点直接链接到本地​​ inputLine 数组,您从外部传递给 addWordNode 函数的指针。 “取消链接”是您忘记做的事情。
  • 谢谢!这越来越清楚了,但是数组必须作为 C 中的指针传递,那么您如何解决这个问题呢?我尝试在addWordNode 函数中将strcpy 放入一个新数组中,但这并没有帮助。如果您必须传递将继续修改的数组,标准做法是什么?
  • “我尝试在 addWordNode 函数中将 strcpy 放入一个新数组中,但没有帮助”。这是一件合理的事情,如果做得正确应该可以工作。具体来说,如果您已正确分配内存。所以请准确地展示你做了什么。
  • 您需要使用strdup()malloc(strlen(word) + 1) 后跟strcpy() 分配给addWordNode() 中的newNode->word。另请注意,点 . 和箭头 -> 运算符绑定非常紧密,它们周围不应有空格。就目前而言,您每次都将相同的指针复制到newNode->word,因此所有单词都指向指针指向的任何数据。请记住在释放列表元素时释放额外分配的空间。并注意内存分配失败。
  • 现在一切正常!!谢谢大家。

标签: c arrays methods linked-list


【解决方案1】:

“因为输入行完全没有链接到哈希表”?恰恰相反,在您的addWordNode 函数中,您将新节点直接链接到本地​​inputLine 数组,您从外部传递给addWordNode 函数的指针。 “取消链接”是您忘记做的事情。 – 蚂蚁

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-30
    • 2023-03-26
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 2013-01-18
    • 2016-01-27
    • 1970-01-01
    相关资源
    最近更新 更多