Сортировка двунаправленного списка - 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, список будет отсортирован по возрастанию данных.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д