c ++附加到链接列表

时间:2016-07-22 09:41:38

标签: c++

我正在编写一段代码将一个节点附加到单链表的末尾,但它似乎根本没有附加任何内容。谁能让我知道我做错了什么?

#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;
    }

3 个答案:

答案 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从未被触及。