Сортировка двунаправленного списка - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Нужно отсортировать двунаправленный список. Кто может помочь, то вот структура списка:
struct count                            // элементы двунаправленного списка
{
    lessons data;                       // данные о дисциплине
    count *pred;                        // указатель на предыдущий элемент
    count *next;                        // указатель на следущий элемент
};
Прототип функции сортировки:
count* sorting (count* &beg)
Вот сейчас пытаюсь сам додуматься, как сделать, глядя на код обычной сортировки массива пузырьком, но сообразить некоторые детали по аналогии к списку не получается. Помогите - может кто уже имел дело. Мне только классы не нужны - обычный с++ или лучше с. P.S. Если кто-то знает другую сортировку, кроме пузырька, пишите. Спасибо. P.S.S. Сортировка идет по целому полю, например, temp->data.average, где average является int. Вот, кто может сообразить, сортировка методом пузырька (только на паскале):
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;

Объяснение кода листинга программы

В данном коде реализуется алгоритм сортировки двунаправленного списка.

  1. Создается структура данных count, которая представляет элемент двунаправленного списка и содержит поля:
    • data (тип lessons) - данные о дисциплине;
    • pred (тип ^count) - указатель на предыдущий элемент;
    • next (тип ^count) - указатель на следующий элемент.
  2. Определяется процедура sort, которая принимает в качестве параметра указатель на голову двунаправленного списка.
  3. Внутри процедуры sort создаются три временные переменные:
    • e (тип ^count) - указывает на предыдущий элемент;
    • i (тип ^count) - текущий элемент;
    • j (тип ^count) - указывает на следующий элемент.
  4. Запускается цикл while, который выполняется до тех пор, пока i и e не указывают на один и тот же элемент (т.е. список не будет отсортирован).
  5. Внутри цикла while выполняется еще один цикл while, который перебирает все элементы списка, начиная с текущего элемента i и заканчивая головой списка list.
  6. Внутри второго цикла while проверяется, если данные текущего элемента i больше данных следующего элемента j, то выполняется операция обмена:
    • значение data текущего элемента i сохраняется в переменной t;
    • data текущего элемента i заменяется на data следующего элемента j;
    • data следующего элемента j заменяется на значение t.
  7. После завершения второго цикла while, i перемещается на следующий элемент (i.next), а j перемещается на предыдущий элемент (j.pred).
  8. Цикл while повторяется до тех пор, пока все элементы списка не будут отсортированы.
  9. По завершении процедуры sort, список будет отсортирован по возрастанию данных.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы