我正在编写一段代码将一个节点附加到单链表的末尾,但它似乎根本没有附加任何内容。谁能让我知道我做错了什么?
#include<iostream>
using namespace std;
struct Node{
int val;
Node* next;
Node(int v) : val(v), next(NULL) {}
};
void append(Node &head, int d){
Node n = head;
while(n.next != NULL){
n = *n.next;
}
Node end(d);
n.next = &end;
}
int main(){
Node head(0);
for(int i=1;i<5;i++){
append(head, i);
}
Node n = head;
while(n.next != NULL){ //print the linked list, result is 0
cout << n.val<<" ";
n = *n.next;
}
cout<<n.val<<endl;
return 0;
}
编辑:我更改了append()方法,每次都附加一个动态分配的节点,但它仍然无法正常工作。
void append(Node &head, int d){
Node n = head;
while(n.next != NULL){
n = *n.next;
}
Node* end = new Node(d);
n.next = end;
}
答案 0 :(得分:6)
您将本地对象Node end(d);
附加到链接列表的末尾。该对象在append
存在时被销毁,最后一个列表元素指向不存在的对象。
答案 1 :(得分:4)
有一些问题。
您可以在append
功能Node n = head;
和此处n = *n.next
制作副本。然后,您最后更改副本而不是原始副本。
您正在堆栈上分配Node end(d)
。当append
返回时,它超出范围并被删除。
您可以使用
修复这两个问题#include<iostream>
#include <memory>
using namespace std;
struct Node{
int val;
std::shared_ptr<Node> next;
Node(int v) : val(v), next(nullptr) {}
};
void append(Node &head, int d){
Node* n = &head;
while(n->next != nullptr){
n = n->next.get();
}
n->next = std::make_shared<Node>(d);
}
int main(){
Node head(0);
for(int i=1;i<5;i++){
append(head, i);
}
Node n = head;
while(n.next != nullptr){
cout << n.val<<" ";
n = *n.next;
}
cout<<n.val<<endl;
return 0;
}
答案 2 :(得分:2)
编辑后的问题:
您将head
复制到n
,然后修改n
。在append
功能结束时,n
被销毁,但head
从未被触及。