为什么这段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的变化非常有用