在 C++ 中的链表末尾插入一个节点 (walter/savitch)

Inserting a node at the end of a linked list in c++ (walter/savitch)

这个函数是为了在尾节点后面插入一个节点而设计的。这只是我们书中的一个练习题,我遇到了困难。 data() 和 link() 函数分别用于检索节点的信息和下一个指针。编译器在这一行给我一个错误:cursor->set_link(i);

void list_tail_insert(node* head_ptr, const node::value_type& entry)
{
    assert (head_ptr != NULL);

    const node *temp = head_ptr;
    const node *cursor;

    node *i = new node; // this is the new tail pointer
    i->set_data(entry);
    i->set_link(NULL);

    if (!head_ptr) // if the linked list is empty
    {
        head_ptr = i; // the tail pointer is the new head pointer
    }

    for (cursor = head_ptr; cursor != NULL; cursor = cursor -> link())
    {
        cout << "Iterating to the tail pointer" << endl;
    }
    cursor->set_link(i);

}

您有两个个问题。

第一个是这个:

if (!head_ptr) // if the linked list is empty
{
    head_ptr = i; // the tail pointer is the new head pointer
}

此处您分配给 head_ptr 变量,但由于变量是按值 传递的 ,这意味着它们被复制,您只是更改了多变的。您从调用者传递给函数的变量不会改变。为了让它工作,你必须通过引用传递头指针:

void list_tail_insert(node*& head_ptr, const node::value_type& entry)

第二个问题是在你的循环之后变量 cursor 将是 NULL。循环条件应该是例如cursor->link() != NULL.

最终工作代码:

void list_tail_insert(node* head_ptr, const node::value_type& entry)
{
    assert (head_ptr != NULL);

    node *cursor;

    node *i = new node; // this is the new tail pointer
    i->set_data(entry);
    i->set_link(NULL);

    if (!head_ptr) // if the linked list is empty
    {
        head_ptr = i; // the tail pointer is the new head pointer
    }

    for (cursor = head_ptr; (cursor -> link()) != NULL; cursor = cursor -> link())
    {
        cout << "Iterating to the tail pointer" << endl;
    }
    cursor->set_link(i);

}