【发布时间】:2014-04-25 05:46:58
【问题描述】:
我正在尝试使用链表进行快速排序的稳定实现,但由于某种原因,这段代码崩溃了。它似乎在它崩溃之前到达了分区中while循环的第二次迭代。
基本上,我使用头部作为枢轴点,任何小于枢轴的东西都会进入新的链表,大于枢轴的任何东西也会进入新的链表。这被递归调用,然后在最后将它们组合起来。
class Node
{
public:
Node* next;
int key;
int key2;
Node()
{
next = NULL;
}
};
void fillRandom(Node*& root, int length)
{
if(length != 0){
root->key = rand()%10;
root->next = new Node;
fillRandom(root->next, length-1);
}
}
void partitionLL(Node*& lessThan, Node*& greaterThan, Node*& root)
{
Node* lessThanTemp = lessThan; Node* greaterThanTemp = greaterThan;
Node* temp = root;
while(temp->next != NULL)
{
if(temp->key > root->key){
greaterThanTemp = temp;
greaterThanTemp->next = new Node;
greaterThanTemp = greaterThanTemp->next;
}else{
lessThanTemp = temp;
lessThanTemp->next = new Node;
lessThanTemp = lessThanTemp->next;
}
temp = temp->next;
}
}
void quickSort(Node* root)
{
if(root->next != NULL){//i.e. theres only two nodes in the list
Node* lessThan = new Node; Node* greaterThan = new Node;
partitionLL(lessThan, greaterThan, root);
quickSort(lessThan);
quickSort(greaterThan);
}else{
return;
}
}
int main()
{
int length = 15;
Node* root = new Node;
fillRandom(root, length);
quickSort(root);
}
【问题讨论】:
-
这是学习如何使用调试器的最佳时机。如果您构建程序的调试版本,并在调试器中运行它,那么调试器将在崩溃的地方停止。然后调试器将让您检查并遍历函数调用堆栈(例如,如果它在库代码中停止),还允许您检查变量的值。
-
调试器也可用于逐行执行代码,在这种情况下可能会更好,因为它可以让您准确地看到代码在做什么以及它为变量分配了什么值.尤其是使用您的
partionLL函数,因为它(对我来说)似乎很可疑。 -
最后一点:你实际上并没有排序任何东西,因为在你第一次从@调用
quickSort时root->next指针将是NULL987654327@函数。 -
最后一件事让我相信你展示给我们的程序并不是真正崩溃的程序,因为这个程序不会做任何可能崩溃的事情:它调用
quickSort,它立即返回,程序退出。真的是崩溃程序的Minimal, Complete, and Verifiable example吗? -
为了让事情看起来更好,我取出了我为链表赋值的部分。我将对其进行编辑。我相信该错误与 temp->next 在第一次运行后为空有关。
标签: c++ linked-list quicksort