Как только head становится последним элементом в связанном списке, вы получаете свой segfault.
Я не хочу писать код, так как это домашнее задание, но добавлю условие, чтобы проверить, является ли head-> next нулевым. Если это так, вам нужно вернуться к началу списка.
Для сортировки по пузырькам потребуется несколько проходов через связанный список. Если вы инициализируете свой связанный список со значениями 5,4,3,2,1, а также печатающей головкой и печатающими темпом и головкой. Вы, вероятно, увидите 5,4 5,3 5,2 5,1 segfault
Кроме того, ваша формула сортировки выглядит немного не так Если у вас есть данные, такие как 2,3,1. Ваш код будет видеть 2 и 3, swapped станет true и функция вернет true.
Возможно, вы захотите использовать цикл внутри цикла, чтобы каждая итерация внешнего цикла вызывала 1 проход по связанному списку. Если после прохождения по всему связанному списку нет перестановок, данные сортируются.
do{
for 1 pass through linked list (this can be a for or while loop)
swap if necessary; set swapped to true
}while(swapped is true)
Надеюсь, это поможет.
Редактировать
После
tmp = head;
Добавить
head = head->next
if(tmp == orig)
orig = head;
Вам нужно сохранить указатель на голове.
В случае 5,4,3,6. Это будет отсортировано следующим образом
4,5,3,6
4,3,5,6
3,4,5,6
Но ваш указатель orig никогда не обновлялся, поэтому ваш вывод будет усечен до 4,5,6.