Сортировка двунаправленного списка - C (СИ)
Формулировка задачи:
Нужно отсортировать двунаправленный список.
Кто может помочь, то вот структура списка:
Прототип функции сортировки:
Вот сейчас пытаюсь сам додуматься, как сделать, глядя на код обычной сортировки массива пузырьком, но сообразить некоторые детали по аналогии к списку не получается. Помогите - может кто уже имел дело.
Мне только классы не нужны - обычный с++ или лучше с.
P.S. Если кто-то знает другую сортировку, кроме пузырька, пишите. Спасибо.
P.S.S. Сортировка идет по целому полю, например, temp->data.average, где average является int.
Вот, кто может сообразить, сортировка методом пузырька (только на паскале):
struct count // элементы двунаправленного списка
{
lessons data; // данные о дисциплине
count *pred; // указатель на предыдущий элемент
count *next; // указатель на следущий элемент
};count* sorting (count* &beg)
procedure Bubble(var item: DataArray; count:integer);
var
i,j: integer;
x: DataItem;
begin
for i := 2 to count do
begin
for j := count downto i do
if item[j-1]>item[j] then
begin
x := item[j-1];
item[j-1] := item[j];
item[j] := x;
end;
end;
end;Решение задачи: «Сортировка двунаправленного списка»
textual
Листинг программы
type count=record // элементы двунаправленного списка data:lessons; // данные о дисциплине pred:^count; // указатель на предыдущий элемент next:^count; // указатель на следущий элемент end; procedure sort(list:^count) var e:^count; i:^count; j:^count; t:lessons; begin e:=list.pred; i:=list; while i<>e do begin j:=i.next; while j<>list do if i.data>j.dta then begin t:=i.data; i.data:=j:data; j.data:=t; end; end; end;
Объяснение кода листинга программы
В данном коде реализуется алгоритм сортировки двунаправленного списка.
- Создается структура данных
count, которая представляет элемент двунаправленного списка и содержит поля:- data (тип lessons) - данные о дисциплине;
- pred (тип ^count) - указатель на предыдущий элемент;
- next (тип ^count) - указатель на следующий элемент.
- Определяется процедура sort, которая принимает в качестве параметра указатель на голову двунаправленного списка.
- Внутри процедуры sort создаются три временные переменные:
- e (тип ^count) - указывает на предыдущий элемент;
- i (тип ^count) - текущий элемент;
- j (тип ^count) - указывает на следующий элемент.
- Запускается цикл while, который выполняется до тех пор, пока i и e не указывают на один и тот же элемент (т.е. список не будет отсортирован).
- Внутри цикла while выполняется еще один цикл while, который перебирает все элементы списка, начиная с текущего элемента i и заканчивая головой списка list.
- Внутри второго цикла while проверяется, если данные текущего элемента i больше данных следующего элемента j, то выполняется операция обмена:
- значение data текущего элемента i сохраняется в переменной t;
- data текущего элемента i заменяется на data следующего элемента j;
- data следующего элемента j заменяется на значение t.
- После завершения второго цикла while, i перемещается на следующий элемент (i.next), а j перемещается на предыдущий элемент (j.pred).
- Цикл while повторяется до тех пор, пока все элементы списка не будут отсортированы.
- По завершении процедуры sort, список будет отсортирован по возрастанию данных.