【发布时间】:2014-02-02 07:51:01
【问题描述】:
我尝试在 C++ 中严格实现我目前正在研究的算法,即带有简单链表的递归函数。这是我的来历:
#include <iostream>
using namespace std;
class Liste {
private :
int val;
Liste *suivante;
public :
Liste(int val = 0, Liste *suivante = NULL) {
this->val = val;
this->suivante = suivante;
}
void afficherElement() const {
cout << "Adresse : " << this << endl;
cout << "Valeur : " << val << endl;
cout << "Adresse suivante : " << suivante << endl;
cout << endl;
}
int tete() const {
return val;
}
Liste reste() const {
return *suivante;
}
bool estVide() const {
return (suivante == NULL);
}
Liste prefixer(int val) {
Liste *nouvelle = new Liste(val, this);
return *nouvelle;
}
Liste suffixer(int val) {
suivante = new Liste(val);
afficherElement(); // test (last element won't be displayed)
return *suivante;
}
};
int main() {
Liste uneListe(3); // 1st element
uneListe.suffixer(5).suffixer(8).suffixer(10); // adding 3 more
cout << "-----------\n\n";
uneListe.afficherElement(); // displaying 1st element : ok
uneListe.reste().afficherElement(); // displaying 2nd element : pointer is NULL !!???
// uneListe.reste().reste().afficherElement(); --> segmentation fault, predictably enough
return 0;
}
如您所料,它不起作用。当我添加元素时,在 add 方法中调用 display 方法时,元素似乎格式正确,尽管指针值和下一个元素的地址不同(我不明白为什么)。
但是,添加过程完成后,我尝试再次显示列表,第一个元素与第二个元素很好地链接,但是有一个 NULL 指针值。想知道为什么 ??
我看过一个包含两个类(Node 和List)的代码,效果很好,但我想知道我的有什么问题。是我在同一个类中创建一个类的新对象吗?
谢谢,
【问题讨论】:
-
我能看到的最大问题是后缀/前缀是“列表”的返回副本,而不是引用。所以最重要的是
.suffixer(8)被应用于 List 对象的副本,而不是您在调用.suffixer(5)时创建的那个。 -
您可以尝试通过引用返回后缀和前缀吗?即 Liste& 后缀(int val)。我认为问题在于您在第二个之后添加的下一个元素将被添加到不同的列表中,因为您按值返回。如果你调试,你可能会看到这个。
-
另外,如果我可以提出建议的话。我实际上会进行设计更改。有一个班级
Liste和一个班级Noeud。基本上,列表有一个指向第一个节点的指针,并负责将节点链接在一起。而不是 list 是当前的节点。 -
你能用
nullptr代替NULL吗?它更像是 c++-ey -
看来你很准。返回值是一个错误,它解释了指针值和对象地址的差异。谢谢。将发布包含所有必要更正的代码。
标签: c++ list linked-list