【发布时间】: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