struct Letter {
char let;
Letter *next;
};
请查看以下名为addLETTERS()的函数。
int main() {
Letter *Top = 0;
Letter *head = 0;
char letters = 'a';
head = new Letter;
Top = new Letter;
MakeNull(head);
MakeNull(Top);
addLETTERS(Top, head,letters);
return 0;
}
void MakeNull(Letter *newNode){
newNode = new Letter;
newNode->let = 0;
newNode->next = 0;
}
出于某些奇怪的原因,离开此功能时,我的链接列表会丢失其创建的所有节点?使用GDB我可以清楚地看到该功能正在运行并将整个字母添加到列表中。有人可以运行这个简单的代码并告诉我原因吗?
struct Letter *addLETTERS(Letter *Top, Letter *head, char& letters) {
if(letters != 'z' + 1){
Top = new Letter;
Top->let = letters++;
Top->next = head;
head = Top;
addLETTERS(Top,head,letters);
}
else {
Top->let = '\0';
Top->next = head;
head = Top;
}
return Top;
}
答案 0 :(得分:2)
这是开始的地方:
int main() {
Letter *Top = 0;
Letter *head = 0;
char letters = 'a';
MakeNull(&head);
MakeNull(&Top);
addLETTERS(Top, head,letters);
return 0;
}
void MakeNull(Letter **newNode){
*newNode = new Letter;
(*newNode)->let = 0;
(*newNode)->next = 0;
}
基本上,如果你这样做:
void MakeNull(Letter *newNode) {
newNode = new Letter;
//...
...你传入一个地址,包含在(指针)变量'newNode'(函数的本地)中 - 但是你会立即为该变量赋值一个新值。传递价值是没用的。修改函数的该值的本地副本不会修改用于传递该值的main函数中的指针变量。
所以我对它进行了修改,以便传入指针变量的地址 - 一个'双指针'。这样,您可以修改main函数中指针变量的内容。
你的'addLetters'函数会出现同样的问题:你传入一个你在函数内部修改的地址(头部) - 但这不会修改你传入的值的变量。
答案 1 :(得分:0)
另外sje397指出,看看结束条件
struct Letter *addLETTERS(Letter *Top, Letter *head, char& letters) {
...
else {
Top->let = '\0';
Top->next = head;
head = Top; <--- this will do nothing
}
return Top;
}
如果你想改变参数'head',你需要把它作为**头传递
*head = Top
答案 2 :(得分:0)
最重要的是非常感谢Anders K和sje397!我使用了你的两个例子并让它发挥作用!这是功能代码。 GBD显示在我的功能之外传递的所有内容及其打印输出。
int main() {
Letter *Top = 0;
Letter *head = 0;
char letters = 'a';
head = new Letter;
Top = new Letter;
MakeNull(&head);
MakeNull(&Top);
addLETTERS(Top, &head,letters);
printLinkedList(head);
return 0;
}
void MakeNull(Letter **newNode){
*newNode = new Letter;
(*newNode)->let = 0;
(*newNode)->next = 0;
}
struct Letter *addLETTERS(Letter *Top, Letter **head, char& letters) {
if(letters != 'z' + 1){
Top = new Letter;
Top->let = letters++;
Top->next = *head;
*head = Top;
addLETTERS(Top,head,letters);
}
return Top;
}
struct Letter *printLinkedList(Letter *Top){
if(Top != 0){
cout << Top->let << endl;
Top = Top->next;
printLinkedList(Top);
}
return Top;
}