我正在嘗試使我的鏈表工作在最簡單的級別。我想添加一個新的節點(變量wordNode)到我定義的鏈表(wordList)。在我的主要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;
}
被要求直接調試,但我已經呆了好幾個小時了。有沒有更大的行爲或字符串操作,我不明白?或者那裏有一個簡單的錯誤?
「因爲輸入行完全不鏈接到散列表」?恰恰相反,在'addWordNode'函數中,您直接將新節點鏈接到本地'inputLine'數組,這是您從外部傳遞給'addWordNode'函數的指針。這種「取消聯繫」是你忘記做的事情。 – AnT
謝謝!這個越來越清晰了,但是數組必須作爲C中的指針傳遞,所以你如何解決這個問題?我嘗試在'addWordNode'函數中將'strcpy'放入一個新數組中,但這並沒有幫助。如果您必須傳遞一個將繼續被修改的數組,那麼標準做法是什麼? –
「我試圖在addWordNode函數中對一個新數組執行strcpy,但這並沒有幫助」。這是一個合理的事情要做,如果正確完成,應該工作。具體來說,如果你已經正確分配了內存。所以請準確顯示你做了什麼。 – kaylum