为什么这段C代码最终会出现无限循环?

时间:2012-01-09 17:35:22

标签: c loops swap infinite

我一直在尝试修复此代码中的无限循环。但是,我无法理解为什么会发生无限循环。此代码尝试在处理之前将作业从最小值排序到最高值。

SortJobs()
{
    linked_list ptr, h, temp, pptr;
    int i, j;

    pptr = ready_queue;
    ptr = ready_queue->next;
    h= ready_queue;

    while(ptr != NULL) {    
        if ((ready_queue->pcb.job_length - ready_queue->pcb.run_time) > (ptr->pcb.job_length - ptr->pcb.run_time)) {
            ready_queue = ptr;
            pptr->next = ptr->next;
            ptr->next = h->next;                
            h->next = pptr->next;
            pptr->next = h;
            ptr=h->next;
            h=ready_queue;
            pptr=ptr->next;
        } else {
            pptr = ptr;
            ptr=ptr->next;          
        }
    }
}

4 个答案:

答案 0 :(得分:1)

gdb是您调试此类问题的朋友。请开始使用调试器!

OTOH,这是circular-(linked)-list?!

提示:在运行SortJobs()之前,您是否可以浏览ready_queue并打印所有元素并查看它是否进入无限循环?!

无限循环的原因可能是因为您尚未将链接列表中的最后一个节点设置为NULL。您可以查看addNode()功能。

答案 1 :(得分:0)

因为ptr总是不为空?

答案 2 :(得分:0)

突出的问题是这一行:

    pptr=ptr->next;

有时可以跟着这一行:

    pptr->next = ptr->next;

中间没有pptrptr的更改。这将导致一个小的单节点循环链表,ptr->next->next == ptr->next。所以你永远不能离开链表。

总的来说,我觉得你的算法很混乱。您确实需要为每个变量确定单个逻辑含义,并提出适当的循环不变量。例如,在循环迭代结束时,您有时会ptr == pptr->next(我认为这是正确的),但有时pptr == ptr->next(我很确定这是错误的,因为上面给出的理由)。

答案 3 :(得分:0)

我发现你的算法非常混乱,我认为这也是错误的。假设循环以某种方式结束并且你做的一切正确,你得到的结果是第一个元素是具有最小job_length的那个 - run_time,但是列表的其余部分将不会被排序。

正如鲁赫克指出的那样,问题是当你摆弄下一个指针时,你搞砸了你的清单,你的事情太复杂了!我不会触及列表本身移动整个节点的结构,而是使用memcpy并仅移动节点携带的数据。这是一个示例功能:

// I assume your linked list is made of nodes such as this
typedef struct {
    struct Node next;
    struct Node prev;     // optional
    struct Somewhat pcb;
} Node;

void swapData(Node *n1, Node *n2)
{
    struct pcb temp;

    memcpy(&temp, n1->pcb, sizeof(struct Somewhat));
    memcpy(n1->pcb, n2->pcb, sizeof(struct Somewhat));
    memcpy(n2->pcb, &temp, sizeof(struct Somewhat));
}

现在我们能够正确地交换节点,我会使用一些经过良好测试/众所周知的排序算法,这样你就可以更轻松地找到帮助,下一个看你的代码的人不会被诱惑自杀(没有冒犯意图,我只是在开玩笑;))。我建议使用一些简单的算法,例如Selection sortBubble sort。不是很快但很容易实现:)