单链表无限循环

时间:2017-10-23 14:47:58

标签: c++ linked-list singly-linked-list

自从我开始学习链表以来已经过了一周,我只能学习单链表。所以今天我实现了我在c ++中学到的链表,当我试图运行它时,代码进入一些随机数的无限循环。我尝试调试代码,但我没有找到什么,所以代码有问题。代码如下。感谢帮助。谢谢

to

2 个答案:

答案 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也是错误的。它没有考虑到headtail可以等于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)

  1. 对于初学者来说,display()是错误的。您希望更新为temp = temp->next;,并且还可以将其初始化为node * temp = head,因此不需要第二行。

  2. 您的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;
    }
    
  3. 如评论中所述,请查看new keyword

  4. 的使用情况