无限循环链表C.

时间:2015-08-30 16:55:55

标签: c linked-list

我正在努力改善我的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;
}

使用调试器我发现我的列表已经排序,但它是无限的。我相信我已经创建了一个循环链表,但我不确定如何解决这个问题。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

有几件事。首先,当要求人们调试代码时,尝试包含行号,这使我们更容易引用问题。现在好了解实际问题。

    该行代码上的
  1. if (temp != prev) prev = prev -> next;只是说它是prev = temp,而不是prev - &gt;接下来因为临时温度总是下一个,它不是一个问题,但我认为它更容易跟进。

  2. 好的,你可以通过制作largest->next = head在头部之前插入最大值。但是在您插入的点之前的索引仍然指向头而不是最大值,因此链接列表中的链接断开。 ***我正在谈论prevToLargest -> next = largest -> next;接近结束后的代码。

  3. 当你回头时,头部被多次移动。因此,当您遍历整个列表时,您的代码将被移动到列表中的最后一个元素,因为您有head = largest;并且最后一个最大元素将是最后一个元素。列表。所以在返回头之前尝试将其指向列表中的第一个元素。

  4. 看看这是否可以解决您的问题。可能会有更多的错误,但这些是突出的我。

相关问题