2016-12-01 61 views
0

我正在嘗試使我的鏈表工作在最簡單的級別。我想添加一個新的節點(變量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; 
    } 

被要求直接調試,但我已經呆了好幾個小時了。有沒有更大的行爲或字符串操作,我不明白?或者那裏有一個簡單的錯誤?

+3

「因爲輸入行完全不鏈接到散列表」?恰恰相反,在'addWordNode'函數中,您直接將新節點鏈接到本地​​'inputLine'數組,這是您從外部傳遞給'addWordNode'函數的指針。這種「取消聯繫」是你忘記做的事情。 – AnT

+0

謝謝!這個越來越清晰了,但是數組必須作爲C中的指針傳遞,所以你如何解決這個問題?我嘗試在'addWordNode'函數中將'strcpy'放入一個新數組中,但這並沒有幫助。如果您必須傳遞一個將繼續被修改的數組,那麼標準做法是什麼? –

+0

「我試圖在addWordNode函數中對一個新數組執行strcpy,但這並沒有幫助」。這是一個合理的事情要做,如果正確完成,應該工作。具體來說,如果你已經正確分配了內存。所以請準確顯示你做了什麼。 – kaylum

回答

0

"因爲輸入行完全不鏈接到散列表"?恰恰相反,在您的addWordNode函數中,您將新節點直接鏈接到本地​​inputLine數組,您從外部傳遞給addWordNode函數的指針。那"取消鏈接"是你忘了做的事情。 –   AnT

相關問題