Этот код отвратителен! Вы не только не предоставили нам все необходимое для воспроизведения вашей проблемы (мы не можем это скомпилировать!), Но вы скрыли абстракции указателей за typedef
(для нас это тоже кошмар). Вообще говоря, нельзя даже использовать связанные списки в C больше не говоря уже о sort их ...
Тем не менее, здесь есть два ответа.
*minafteri = j;
найденный в вашем цикле find фактически изменяет ваш список! Почему ваш find цикл изменяет ваш список?
Ответ: не должно! Вместо этого, назначив minafteri = &j->next
, вы не будете изменять список с помощью цикла поиска ...
Кроме того, вы можете выполнить обмен внутри этого цикла.
*minafteri = j;
потребуется поменять местами следующее в следующем порядке:
(*minafteri)->next
и j->next
*minafteri
и j
Как вы думаете, одна строка кода способна выполнить эти два обмена? Ну, он проходит половину одного из них ... и в процессе удаляет кучу элементов из вашего списка!
Следующая попытка замены элементов выглядит следующим образом:
score_entry *minafteri = a; // half of assigning `a` to `a`
/* SNIP!
* Nothing assigns to `minafteri` in this snippet.
* To assign to `minafteri` write something like `minafteri = fubar;` */
score_entry tmp = *a; // half of assigning `*a` to `*a`
a = minafteri; // rest of assigning `a` to `a`
*minafteri = tmp; // rest of assigning `*a` to `*a`
Это действительно просто присвоение *a
*a
и a
a
... Как вы думаете, вам нужно это сделать?
Я бы подумал, что вы заметите , что , когда создавали свой MCVE ... Ох, подождите минуту! Позор вам!
Сосредоточьтесь на том, чтобы поменять местами два узла в списке как меньшую задачу. Как только вы это сделаете, подумайте над выполнением этой задачи.