我試圖做一個鏈接列表,其中每個節點存儲一個字符串,但我有一個問題,其中每個節點最終在每個節點中存儲相同的確切字符串單節點。在main()的結尾處,我打印出存儲在每個節點中的單詞,它總是重複爲整個列表輸入的最後一個字符串。鏈接列表的每個節點具有相同的字符串
我沒有任何線索發生了什麼事情,因爲如果我將它製作成一串字符,它就可以很好地工作,每個字符都存儲在正確的節點中。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct wordnode {
char *word;
struct wordnode *next;
};
struct wordnode *link = NULL;
void addword(char *aword);
int main(void) {
char *aword;
int i;
for(i = 0; i < 10; i++) {
scanf(" %s", aword);
addword(aword);
}
printf("\n");
for(; link != NULL; link = link->next) {
printf("|%s ", link->word);
}
printf("|\n");
return 0;
}
void addword(char *aword) {
struct wordnode *cur, *prev, *new_node;
new_node = malloc(sizeof(struct wordnode));
new_node->word = aword;
for(cur = link, prev = NULL; cur != NULL; prev = cur, cur = cur->next) {
;
}
new_node->next = cur;
if(prev == NULL) {
link = new_node;
} else {
prev->next = new_node;
}
}
您有多個問題。它開始於你如何使用'scanf'傳遞未初始化的指針。 'scanf'函數需要一些足夠大的分配內存來寫入輸入。它不分配內存本身。 –
您應該複製輸入的字符串。 –
指針不會奇蹟般地創建內存。 'char * aword'未初始化並指向未定義的位置。像這樣使用它會調用未定義的行爲。它應該是char char [SIZE];'爲了*分配char數組。你不應該簡單地複製指針('new_node-> word = aword;'),而是複製指向的位置(參見'strdup')。最後,在C中一貫的做法是釋放所有分配的內存。祝你好運,練習C ;-) ... –