双链表C ++上的插入排序

时间:2018-07-18 04:10:16

标签: c++ sorting linked-list doubly-linked-list insertion

我目前正在学习许多不同的数据排序方式。我正在尝试使用C ++在双链表上实现插入排序。 我了解在数组上使用它的概念。但是,我很难弄清楚为什么我的“ while”循环无限循环。

这是我的代码:

template <class T>
class Node
{
protected:
  T item;
  Node<T>* prev;
  Node<T>* next;

public :
  Node()
  {
    prev=nullptr;
    next=nullptr;
  }
};

//InsertionSort
void insertionSort()
{
    Node<T>* current = head->next;
    int count = 1;

    for(current; current != nullptr; current=current->next)
    {

        Node<T>* j = current;
        Node<T>* bj = j->prev;

        while(j != nullptr && j->item < bj->item)
        {
            cout << count++ <<  "Hi" << endl;
            Node<T>* temp = j->next;

            j->next = bj;
            bj->prev = j;

            bj->next = temp;
            temp->prev = bj;
        }
    }
}

我添加了int count以查看循环发生了多少次。我的for循环应该发生920次,而且确实如此。但是,我的while循环似乎无限循环。

请帮助。

1 个答案:

答案 0 :(得分:1)

它永远运行,因为所有指针都弄糟了。假设您从bj,j以及某些节点a和b开始:

NULL <--- NodeA <---> Bj <---> J <---> NodeB ---> NULL

在单个while循环迭代结束时,您的节点处于以下状态:

NodeA:          NULL <--- NodeA ---> Bj
Bj:             j    <---   Bj  ---> NodeB
J:              Bj   <---   J   ---> Bj
NodeB:          Bj   <--- NodeB ---> NULL

您可以看到j现在在两个方向上都指向bj,而NodeA上没有“上一个”点。

第二次迭代(以及所有后续迭代到无穷大迭代)之后,您的节点将如下所示:

NodeA:          NULL <--- NodeA ---> Bj
Bj:             Bj   <---   Bj  ---> Bj
J:              Bj   <---   J   ---> Bj
NodeB:          Bj   <--- NodeB ---> NULL

现在您可以看到j和bj都在两个方向上都指向bj。

“请帮助”相当模糊,因此我只是帮助您确定了实际的行为。将来,我鼓励您用笔或纸(或类似的东西)写下测试用例的预期结果,然后在逐步执行代码时写下实际结果。