Это может быть для педантичных целей, но не для домашних заданий. У меня вопрос ниже: «Сортировка односвязного списка» (любой вид списка). Предположим, что для этих вопросов мы хотим сортировать в порядке возрастания значений в каждом узле.Что ожидается, когда мне скажут «Сортировка отдельно связанного списка»
Означает ли этот вопрос, что я просто сортирую список, заменяя значения каждого узла в списке, чтобы значения были в некотором порядке (восходящий/нисходящий). Здесь исходные значения узлов (перед сортировкой) будут изменены, чтобы отразить отсортированный список. Здесь возвращается прежний указатель головы, но теперь он имеет самый маленький элемент в нем, который может отличаться от предыдущего элемента.
Как это C код, который я ниже (ниже код не может скомпилировать как есть, но у меня он работает отлично Опубликовано здесь в качестве иллюстрации, чтобы очистить мою точку зрения.):
struct lnk_lst
{
int val;
struct lnk_lst *next;
};
main()
{
//Assume curr is the head node of the singly linked list created with some values
curr = llist_bubble_sort(curr);
}
struct lnk_lst* llist_bubble_sort(struct lnk_lst *lst)
{
int i,n=0,tmpint;
struct lnk_lst *tmp=lst,*tmp2=lst;
while(tmp->next)
{
lst = tmp2;
while(lst->next)
{
if(lst->val > lst->next->val)
{
tmpint = lst->val;
lst->val = lst->next->val;
lst->next->val = tmpint;
}
lst = lst->next;
}
tmp = tmp->next;
}
return tmp2;
}
ИЛИ
Ожидается ли, что указатель на узел с наименьшим элементом (в порядке возрастания) в исходном порядке перемещается как новый головной узел, тогда узел, имеющий следующий наименьший элемент, связан с головным узлом и так далее, список переупорядочивается полностью, и теперь возвращенный головной узел не тот же указатель, что и раньше.
Если интерпретация сортировки списка - это вторая, то я должен увидеть, как сделать эту идею в коде.
Я бы сказал, что это зависит от многого. В общем, замена указателей должна быть дешевле, чем замена содержимого (требуется меньше копирования данных). –
Я ожидаю второй вариант, хотя, если это всего лишь список целых чисел, которые волнуют. В основном это делается так же, как замена значений. Вам просто нужно будет отслеживать предыдущий узел в списке (за исключением первых двух), чтобы вы могли исправить в нем указатель. – tvanfosson
@ Oli - хорошо, поэтому, когда его спросят, нужно спросить, что именно ожидается. Согласитесь, что вы говорите, о меньших транзакциях памяти в указателях подкачки, но логика может быть немного сложнее, чем в первом случае. – goldenmean