我目前正在学习许多不同的数据排序方式。我正在尝试使用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循环似乎无限循环。
请帮助。
答案 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。
“请帮助”相当模糊,因此我只是帮助您确定了实际的行为。将来,我鼓励您用笔或纸(或类似的东西)写下测试用例的预期结果,然后在逐步执行代码时写下实际结果。