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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2021, 21:01   #1
maverick231
Пользователь
 
Регистрация: 17.11.2020
Сообщений: 15
Восклицание Сортировка односвязного списка

Необходимо упорядочить список: в начало положительные, затем 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 вне форума Ответить с цитированием
Старый 20.03.2021, 06:01   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
а положительные - в порядке, обратном требуемому.
а КАКОЙ порядок для положительных требуется?
Цитата:
в начало положительные
Цитата:
Код:
  ListN:=Elem; // теперь он 1-ый
каждый вновь добавляемый(положительный) в САМОЕ начало.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 20.03.2021, 10:55   #3
maverick231
Пользователь
 
Регистрация: 17.11.2020
Сообщений: 15
По умолчанию

evg_m, для положительных требуется порядок, в котором они даны. Например, при записи в список последовательности 1, 3, -4, 0, -5, 7 в списке должна быть последовательность 1, 3, 7, 0, -4, -5
maverick231 вне форума Ответить с цитированием
Старый 20.03.2021, 18:18   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Какое то дежавю.
Уже по этой тепе написал, но куда делся мой ответ?

По существу:
У вас добавление положительных чисел делается в голову списка.
Т.е. 1, 3, -4, 0, -5, 7 станет: 7, 3, 1, 0, -4, -5.
Необходимо выполнять добавление в хвост группы.
Это можно сделать как через один список с поиском хвоста группы, либо, что я бы предпочёл, создать три списка, распределить по ним числа, а затем, объединить списки в один.
Очень советую посмотреть книжку: Т.А. Павловская, Программирование на ЯВУ, Паскаль.
Она есть в списке литературы этого раздела.
Там описана работа с односвязным списком и приведён хороший пример.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 20.03.2021, 18:44   #5
maverick231
Пользователь
 
Регистрация: 17.11.2020
Сообщений: 15
По умолчанию

ViktorR, просмотрел книгу, которую Вы посоветовали, но так и не понял, как реализовать поиск хвоста группы.
maverick231 вне форума Ответить с цитированием
Старый 21.03.2021, 09:20   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

надо найти где заканчивается группа положительных.
а заканчивается она там где их больше нет (т.е. следующее число <=0)

у вас уже реализовано
Цитата:
Код:
             begin // найти после какого
               ListC:=ListN; // с начала списка
а еще надо найти ПЕРЕД которым
и вставить после предыдущего к этому.

P.S. или же НАЙТИ последний ИЗ ... (>0)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 21.03.2021 в 09:24.
evg_m на форуме Ответить с цитированием
Старый 21.03.2021, 17:27   #7
maverick231
Пользователь
 
Регистрация: 17.11.2020
Сообщений: 15
По умолчанию

evg_m, я уже все возможные варианты перепробовал, не получается найти конец группы положительных чисел. Не могли бы Вы написать код?
maverick231 вне форума Ответить с цитированием
Старый 21.03.2021, 17:56   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
этот есть первый
пока следующий за этим >0 
  этот заменить на следующий за ним
заменить на переменные и т.п.

ну и конечно случаи когда
1. список (длина списка) <=1
2. сразу первый <=0
3. ??? (не знаю что еще)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 21.03.2021 в 17:59.
evg_m на форуме Ответить с цитированием
Старый 21.03.2021, 18:11   #9
maverick231
Пользователь
 
Регистрация: 17.11.2020
Сообщений: 15
По умолчанию

evg_m, так у меня вроде так и написано
Код:
 begin // найти после какого
               ListC:=ListN; // с начала списка
               while (ListC^.next <> nil) and (ListC^.next^.info > 0) do
               ListC := ListC^.next;
              AddMedium(ListN, ListC, ListK, r); // добавить после текущего
             end;
Или я Вас не правильно понял?
maverick231 вне форума Ответить с цитированием
Старый 21.03.2021, 19:01   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

if r < 0 then AddLast(ListN, ListK, r) // добавить в конец
else
begin // найти после какого
ListC:=ListN; // с начала списка
while (ListC^.next <> nil) and (ListC^.next^.info > 0) do

Цитата:
так у меня вроде так и написано
но КОГДА ? ( в каком случае ?)
Цитата:
Код:
if r>0 then ...
else if r<0 then ...
else // if r=0 then ...
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 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