Я нахожу ваш алгоритм очень запутанным, и я думаю, что он также неверен.Предположим, что цикл как-то заканчивается, и вы все сделали правильно, в результате вы получите первый элемент с минимальным значением 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));
}
Теперь, когда мы можем правильно поменять узлы, я бы использовал некоторый хорошо проверенный / хорошо известный алгоритм сортировки, так что вы найдете помощь проще иследующий, кто будет смотреть на твой код, не будет искушать себя убить (не в обиду, я просто шучу;)).Позвольте мне предложить несколько простых алгоритмов, таких как Выбор сортировки или Пузырьковая сортировка .Не очень быстро, но легко реализуемо:)