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