简体   繁体   中英

c++ Append to linked list

I'm writing a piece of code to append a node to the end of a singly linked list, but it seems that it doesn't append anything at all. Can anybody give me some idea of what I'm doing wrong?

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

EDIT: I changed the append() method to append a dynamically-allocated node each time, but it still doesn't work.

void append(Node &head, int d){
            Node n = head;    
            while(n.next != NULL){
                    n = *n.next;
            }
            Node* end = new Node(d);
            n.next = end;
    }

You append the local object Node end(d); to the end of the linked list. This object is destroyed upon exist from append and the last list element points to a non-existent object.

A few issues with this.

You make a copies in your append function here Node n = head; and here n = *n.next . You then then finally make a change to the copy rather than the original.

You are assigning Node end(d) on the stack. When append returns it goes out of scope and is deleted.

You can fix both with,

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

For the edited Question: You are copying the head to n , then modify n . At the end of your append function, n is destroyed, but head was never touched.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM