Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2021, 23:06   #1
maverick231
Пользователь
 
Регистрация: 17.11.2020
Сообщений: 15
Восклицание Сортировка односвязного списка. delphi/pascal

Необходимо упорядочить список: в начало положительные, затем 0, в конец отрицательные.
Код:
type
  TInfo = integer;
 
  PElem = ^TElem;
  TElem = record
      info: TInfo;
      next: PElem;
  end;

procedure AddR(var ListN, ListK: PElem; r: integer); // адреса начала и конца списка и R
var ListC: PElem;  // текущий элемент списка
begin
   if ListN = nil then CreateList(ListN , ListK, r) // если список пуст
     else
       if r > 0 then AddFirst(ListN, ListK, r) // добавить в начало
        else
         if r < 0 then AddLast(ListN, ListK, r) // добавить в конец
           else
             begin // найти после какого
               ListC:=ListN; // с начала списка
               while (ListC^.next <> nil) and (ListC^.next^.info > 0) do
               ListC := ListC^.next;
              AddMedium(ListN, ListC, ListK, r); // добавить после текущего
             end;


procedure AddFirst(var ListN: PElem; ListK: PElem; r: TInfo);
var Elem: PElem;
begin
  new(Elem);
  Elem^.info:=r;
  Elem^.next:=ListN;
  ListN:=Elem; // теперь он 1-ый
end;
 
// добавить новый элемент в конец
procedure AddLast(ListN: PElem; var ListK: PElem; r: TInfo);
begin
  new(ListK^.next);
  ListK^.next^.info:=r;
  ListK^.next^.next:=nil;
  ListK:= ListK^.next;
end;
 
// добавить новый элемент в середину после ListC (не в конец)
procedure AddMedium(ListN,ListC,ListK: PElem; r: TInfo);
var Elem: PElem;
begin
  new(Elem);
  Elem^.info:=r;
  Elem^.next:=ListC^.next; // после него то, что было после ListC
  ListC^.next:=Elem; // а он сам после ListC
end;
Проблема в том, что нули и отрицательные числа упорядочиваются в требуемом порядке, а положительные - в порядке, обратном требуемому. В чём может быть проблема?
maverick231 вне форума Ответить с цитированием
Старый 17.03.2021, 17:24   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

При записи в список последовательности 1, 2, -4, 0, 0, -5, 6
В списке будет последовательность:
a) 1
b) 2, 1
c) 2, 1, -4
d) 2, 1, 0, -4
e) 2, 1, 0, 0, -4
f) 2, 1, 0, 0, -4, -5
g) 6, 2, 1, 0, 0, -4, -5

Но ведь это вы так построили добавление положительного числа.
У вас положительное число добавляется в голову списка.
Т.е. при добавлении положительного числа, для сохранения порядка поступления, надо искать хвост положительной серии.

Рекомендую посмотреть учебник по Паскалю Т.А. Павловская, Программирование на ЯВУ, Паскаль.
Там есть хороший пример работы со списком, и не только.

PS: Эл. книга есть в разделе Литература, там где про Паскаль и Делфи ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сортировка односвязного списка Levenyatko Общие вопросы C/C++ 0 05.07.2012 22:12
Сортировка линейного односвязного списка Klik_1602 Помощь студентам 4 02.03.2011 19:45
Сортировка односвязного списка (C++) biograf Помощь студентам 0 14.12.2010 21:21
Сортировка односвязного списка amerhant Общие вопросы C/C++ 1 13.05.2010 20:25
Сортировка односвязного списка btf Общие вопросы C/C++ 0 15.02.2010 14:40