Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这段C代码最终会出现在一个无限循环中?_C_Loops_Swap_Infinite - Fatal编程技术网

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

为什么这段C代码最终会出现在一个无限循环中?,c,loops,swap,infinite,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_q

我一直在尝试修复代码中的无限循环。然而,我无法理解为什么会出现无限循环。此代码试图在处理作业之前将作业从最小到最大排序

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;          
        }
    }
}

因为ptr总是不为null???

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

OTOH,这是一个
循环(链接)列表吗

提示:在运行
SortJobs()
之前,您是否可以运行
ready\u队列
并打印所有元素,看看它是否处于无限循环中


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

突出的问题是这一行:

    pptr=ptr->next;
    pptr->next = ptr->next;
有时可以跟在这行后面:

    pptr=ptr->next;
    pptr->next = ptr->next;
中间对
pptr
ptr
无任何更改。这将产生一个小的单节点循环链表,带有
ptr->next->next==ptr->next
。所以你永远也出不了链表


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

我发现您的算法非常混乱,我认为它也是错误的。假设循环以某种方式结束,并且您将所有事情都做对了,那么您将得到的结果是,第一个元素是具有最小作业长度-运行时间的元素,但列表的其余部分不会排序

正如ruakh指出的,问题是当你摆弄所有下一个指针时,你把列表弄乱了,你把事情复杂化了!我不会触及移动整个节点的列表本身的结构,而是使用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));
}

既然我们能够正确地交换节点,我将使用一些经过良好测试/众所周知的排序算法,这样您将更容易找到帮助,下一个查看您的代码的人也不会想自杀(我只是开玩笑,无意冒犯;)。让我建议一些简单的算法,比如or。不是很快但很容易实现:)

您是否尝试在调试器中单步执行代码?单步执行代码以查看每次循环后ptr的变化非常有用