我正在努力改善我的C.这是一个问题:
编写一个函数来对整数的链表进行排序,如下所示:
a)找到列表中的最大值。
b)将其从位置删除并将其插入列表的头部。
c)从现在的第二个元素开始,重复(a)和(b)。
d)从现在的第三个元素开始,重复(a)和(b)。
继续,直到列表排序。
我的排序功能:
NodePtr sortList(NodePtr np) {
NodePtr makeNode(int), head, temp;
head = temp = np;
if (np != NULL) {
// Determine linked list length
int len = 0;
while (temp != NULL) {
len++;
temp = temp -> next;
}
int i;
for (i = 0; i < len; i++) {
temp = head;
int j;
// Traverse to spot j in linked list
for (j = 0; j < i; j++) {
temp = temp -> next;
}
// Find largest
NodePtr largest, prev, prevToLargest;
largest = prev = prevToLargest = temp;
while (temp != NULL) {
if (temp -> num > largest -> num) {
largest = temp;
prevToLargest = prev;
}
if (temp != prev) prev = prev -> next;
temp = temp -> next;
}
prevToLargest -> next = largest -> next;
largest -> next = head;
head = largest;
}
}
return head;
}
使用调试器我发现我的列表已经排序,但它是无限的。我相信我已经创建了一个循环链表,但我不确定如何解决这个问题。
感谢您的帮助!
答案 0 :(得分:0)
有几件事。首先,当要求人们调试代码时,尝试包含行号,这使我们更容易引用问题。现在好了解实际问题。
if (temp != prev) prev = prev -> next;
只是说它是prev = temp,而不是prev - &gt;接下来因为临时温度总是下一个,它不是一个问题,但我认为它更容易跟进。
好的,你可以通过制作largest->next = head
在头部之前插入最大值。但是在您插入的点之前的索引仍然指向头而不是最大值,因此链接列表中的链接断开。 ***我正在谈论prevToLargest -> next = largest -> next;
接近结束后的代码。
当你回头时,头部被多次移动。因此,当您遍历整个列表时,您的代码将被移动到列表中的最后一个元素,因为您有head = largest;
并且最后一个最大元素将是最后一个元素。列表。所以在返回头之前尝试将其指向列表中的第一个元素。
看看这是否可以解决您的问题。可能会有更多的错误,但这些是突出的我。