自从我开始学习链表以来已经过了一周,我只能学习单链表。所以今天我实现了我在c ++中学到的链表,当我试图运行它时,代码进入一些随机数的无限循环。我尝试调试代码,但我没有找到什么,所以代码有问题。代码如下。感谢帮助。谢谢
to
答案 0 :(得分:1)
成员函数display
没有意义。
它使用未初始化的新创建的head
来覆盖数据成员temp
。
node * temp = new node;
head=temp;
因此该函数调用未定义的行为。
该功能可以看起来像
void display()
{
for ( node * temp = head; temp != nullptr; temp = temp->next )
{
cout << temp->data << "\t";
}
}
或者最好按以下方式定义
std::ostream & display( std::ostream &os = std::cout )
{
for ( node * temp = head; temp != nullptr; temp = temp->next )
{
os << temp->data << "\t";
}
return os;
}
数据成员insert_end
也是错误的。它没有考虑到head
和tail
可以等于nullptr
并且不会更改它们。
该功能可以通过以下方式定义
void insert_end(int value)
{
node *newnode = new node { value, nullptr };
if ( tail == nullptr )
{
head = tail = newnode;
}
else
{
tail = tail->next = newnode;
}
}
成员函数delete_node
首先对单链表没有意义,并且再次出错并调用未定义的行为。该函数应该从列表中删除第一个节点。
然而,如果你想从列表中删除最后一个节点,那么该函数可能看起来像
void delete_node()
{
if ( head != nullptr )
{
tail = nullptr;
node *current = head;
while ( current->next )
{
tail = current;
current = current->next;
}
if ( tail == nullptr )
{
head = tail;
}
else
{
tail->next = nullptr;
}
delete current;
}
}
答案 1 :(得分:0)
对于初学者来说,display()
是错误的。您希望更新为temp = temp->next;
,并且还可以将其初始化为node * temp = head
,因此不需要第二行。
您的delete_node()
可以重写为:
if (head->next == NULL) // handles the case that it consists of 1 element
{
delete head;
head = NULL;
}
else
{
node *nextToEnd = head;
node *end = head->next;
while (end->next != NULL)
{
nextToEnd = end;
end = end->next;
}
delete end;
nextToEnd->next = NULL;
}
如评论中所述,请查看new keyword