使用函数向链表添加新节点时,为什么需要返回新节点?

问题描述 投票:0回答:1

目前我正在尝试创建一个链接列表。

这是我用来创建节点的类:

class node{
    public:
        int item;
        node* ptr_next;
        node(int new_item = 0, node* new_ptr_next = nullptr):
            item(new_item), ptr_next(new_ptr_next){}
};

这是我用来向树添加节点的函数:

//Adds a node to the end of the linked list.
//by making the last node point to the new node
node append_node(const int& item, node* ptr_entry_node){
    node* ptr_last_node;
    node* ptr_current_node;
    //Finds Last Node In List
    ptr_current_node = ptr_entry_node;
    while (ptr_current_node->ptr_next != nullptr){
        ptr_current_node = ptr_current_node->ptr_next;
    }
    ptr_last_node = ptr_current_node;
    //Instanciates a new node and makes the last node point to the new node
    node new_node(item);
    ptr_last_node->ptr_next = &new_node;
    return new_node;
}

这是主程序。

int main(){
    //Creates a node for the beggining of the linked list.
    node entry_node;
    append_node(12,&entry_node);
    std::cout<<entry_node.item<<"\n";
    std::cout<<entry_node.ptr_next->item<<"\n";
}

当我运行

main()
时,我收到以下输出:

0
12

这是我期望的输出。 但是,如果我将

append_node
更改为:

void append_node(const int& item, node* ptr_entry_node){
        //Exact same code but no "return new_node;"
}

当我运行

main()
时,我收到以下输出:

0
-1108142424

当我再次运行程序时,输出的第二个数字发生了变化。 这不是我所期望的。

如果有人能解释为什么我需要在

return new_node;
append_node
才能将新节点成功添加到链表中,我将非常感谢您的帮助。

c++ pointers linked-list return
1个回答
0
投票

Append 应该分配节点,而不是使用节点的本地实例。 我修改了一些使用new和delete的旧代码。我懒得改名字。

#include <iostream>

class node{
    public:
        int item;
        node* next;
        node(int new_item = 0, node* new_next = nullptr):
            item(new_item), next(new_next){}
};

node * append_node(node* list, const int& item){
    node* current;
    node* ptr_new = new node(item);
    if(list == nullptr)                 // if empty list return ptr to new node
        return ptr_new;
    current = list;                     // find end of list
    while (current->next != nullptr){
        current = current->next;
    }
    current->next = ptr_new;            // append node
    return list;
}

int main(){
    node* list = nullptr;               // empty list
    node* current;
    node* next;
    list = append_node(list, 12);       // append 2 nodes and display
    list = append_node(list, 34);
    std::cout << list->item <<std::endl;
    std::cout << list->next->item <<std::endl;
    current = list;                     // delete nodes in list
    while (current != nullptr) {
        next = current->next;
        delete current;
        current = next;
    }
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.