为什么修改不相关的变量会导致链表中的更改?

时间:2016-12-01 04:56:56

标签: c arrays methods linked-list

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

问题在于,当我尝试打印列表头部的单词时,会打印对输入行所做的任何更改。例如,此处不打印“Hello” ,“Go”打印出来。我无法理解这是如何可能的,因为输入行完全取消了与哈希表的链接; “Go”这个词不应该影响哈希表中的值吗?下面是主要功能的代码。

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;
  }

我很遗憾要求直接调试,但我已经在这几个小时了。是否有更大的字符串或字符串操作行为,我不明白?或者那里有一个简单的错误?

1 个答案:

答案 0 :(得分:0)

“因为输入行完全取消了与哈希表的链接”?恰恰相反,在您的addWordNode函数中,您将新节点直接链接到本地​​inputLine数组,指向您从外部传递给addWordNode函数的指针。这种“脱钩”是你忘记做的事情。                      - ANT