我开始学习C ++ - 特别是指针。我以为我会尝试一个基本的链表。这是我的代码:
#include <iostream>
using namespace std;
struct Linked {
Linked *next;
string val;
};
Linked newLinked(string val);
Linked addLinked(Linked l, string val);
void printLinked(Linked l);
Linked newLinked(string val) {
Linked l;
l.val = val;
l.next = NULL;
return l;
}
Linked addLinked(Linked l, string val) {
Linked n = newLinked(val);
n.next = &l;
return n;
}
void printLinked(Linked l) {
Linked *r = &l;
while (r != NULL) {
cout << (*r).val << endl;
r = (*r).next;
}
}
int main() {
Linked list = newLinked("This is the root node.");
list = addLinked(list, "This is the second node.");
list = addLinked(list, "This is the third node.");
list = addLinked(list, "This is the fourth, and final, node.");
printLinked(list);
return 0;
}
很抱歉,如果我的格式很糟糕,或者我违反惯例,仍在学习。 (如果您愿意,请继续并指出我如何改进我的代码风格,我来自Java / JS背景!)
跑步时,我明白了:
This is the fourth, and final, node.
�;��R�;��R
This is the fourth, and
�;��R�;��R
我的猜测是,包含早期字符串的内存被覆盖 - &#34;这是第四个的长度,&#34;与&#34相同;这是第二个节点。&#34;。
不幸的是,我很难过为什么会这样......我希望这里的某个人能够指向我(哈哈)朝着正确的方向前进。
答案 0 :(得分:0)
这就是使代码正常工作的方法。
struct Linked {
Linked *next;
string val;
};
Linked* newLinked(string val);
Linked* addLinked(Linked* l, string val);
void printLinked(Linked l);
Linked* newLinked(string val) {
Linked *l = new Linked;
l->val = val;
l->next = NULL;
return l;
}
Linked* addLinked(Linked* l, string val) {
Linked *n = newLinked(val);
n->next = l;
return n;
}
void printLinked(Linked* l) {
Linked *r = l;
while (r != NULL) {
cout << (*r).val << endl;
r = (*r).next;
}
}
int main(){
Linked *list = newLinked("This is the root node.");
list = addLinked(list, "This is the second node.");
list = addLinked(list, "This is the third node.");
list = addLinked(list, "This is the fourth, and final, node.");
printLinked(list);
return 0;
}
请注意,这会导致内存泄漏,因为我们执行新但没有删除。我们需要类似的东西:
void destroyList(Linked *l){
while(l){
Linked *r = l->next;
delete l;
l = r;
}
}
避免泄漏。在main()的末尾调用此 destroyList 。