在 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);
}
这个函数是为了在尾节点后面插入一个节点而设计的。这只是我们书中的一个练习题,我遇到了困难。 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);
}