Перенести в начало списка все отрицательные элементы, вернуть количество переносов - Pascal
Формулировка задачи:
Дана, вот такая вот задачка: "«Перенести» в начало списка все отрицательные элементы, вернуть количество переносов."
Односвязный список и все такое. Проблема в том, что я ни как не могу придумать алгоритм решения данной задачи.
Решение задачи: «Перенести в начало списка все отрицательные элементы, вернуть количество переносов»
textual
Листинг программы
- const
- count = 25;
- type
- tList = ^rList;
- rList = record
- N : Integer;
- X : tList;
- end;
- function Create : tList;
- var
- First, Cur : tList;
- i : Integer;
- begin
- New(First);
- First^.N := Random(21)-10;
- Cur := First;
- for i := 2 to count do
- begin
- New(Cur^.X);
- Cur := Cur^.X;
- Cur^.N := Random(21)-10;
- end;
- Cur^.X := nil;
- Create := First;
- end;
- procedure See(List : tList);
- begin
- while List <> nil do
- begin
- Write(#32, List^.N);
- List := List^.X;
- end;
- WriteLn;
- end;
- procedure MoveToBegin(var List : tList);
- function isolate(E : tList) : tList;
- var
- Cur : tList;
- begin
- if E = List then
- List := List^.X
- else
- begin
- Cur := List;
- while Cur^.X <> E do
- Cur := Cur^.X;
- Cur^.X := E^.X;
- end;
- isolate := E;
- end;
- procedure connect(var L, E : tList);
- var
- Cur : tList;
- begin
- if L = nil then
- L := E
- else
- begin
- Cur := L;
- while Cur^.X <> nil do
- Cur := Cur^.X;
- Cur^.X := E;
- end;
- end;
- var
- Cur, Tmp, Negative, tmpNegative : tList;
- begin
- Negative := nil;
- Cur := List;
- while Cur^.X <> nil do
- if Cur^.N < 0 then
- begin
- Tmp := Cur;
- Cur := Cur^.X;
- tmpNegative := isolate(Tmp);
- tmpNegative^.X := nil;
- connect(Negative, tmpNegative);
- end
- else
- Cur := Cur^.X;
- if Negative <> nil then
- begin
- Tmp := List;
- List := Negative;
- connect(List, Tmp);
- end;
- end;
- var
- List : tList;
- begin
- Randomize;
- List := Create;
- WriteLn('Список:'); See(List);
- MoveToBegin(List);
- WriteLn('Отрицательные в начале:'); See(List);
- end.
Объяснение кода листинга программы
- Определение константы
count
со значением25
- Определение типа
tList
как указателя наrList
- Определение структуры
rList
с полямиN
типа Integer иX
типа указателя наtList
- Определение функции
Create
без параметров, которая возвращает указатель наtList
- Определение переменных
First
,Cur
,i
типа Integer - Выделение памяти для
First
- Присвоение случайного значения от -10 до 10 полю
N
структурыFirst
- Присвоение
Cur
значенияFirst
- Цикл от 2 до
count
а. Выделение памяти дляCur^.X
(следующего элемента списка) b. Переход к следующему элементу списка c. Присвоение случайного значения от -10 до 10 полюN
структурыCur^.X
- Присвоение
Cur^.X
значение nil (конец списка) - Возврат значения
First
из функцииCreate
- Определение процедуры
See
с параметромList
типа указателя наtList
- Цикл, пока
List
не равно nil а. Вывод значения List^.N (элемента списка) b. Переход к следующему элементу списка - Вывод в консоль символа новой строки
- Определение процедуры
MoveToBegin
с параметромList
типа указателя наtList
- Определение функции
isolate
с параметромE
типа указателя наtList
, возвращающую указатель наtList
- Определение процедуры
connect
с параметрамиL
иE
типа указателя наtList
- Определение переменных
Cur
,Tmp
,Negative
,tmpNegative
типа указателя наtList
- Присвоение
Negative
значения nil - Присвоение
Cur
значенияList
- Цикл, пока
Cur^.X
не равно nil а. Если значение поляN
у текущего элемента списка меньше 0- Присвоение
Tmp
значенияCur
- Переход к следующему элементу списка
- Присвоение
tmpNegative
значенияisolate(Tmp)
- Присвоение поля
X
спискаtmpNegative
значения nil - Вызов
connect
с параметрамиNegative
иtmpNegative
b. Иначе - Переход к следующему элементу списка
- Присвоение
- Если
Negative
не равно nil а. ПрисвоениеTmp
значенияList
b. ПрисвоениеList
значенияNegative
c. Вызовconnect
с параметрамиList
иTmp
- Определение переменной
List
типа указателя наtList
- Генерация случайных чисел
- Присвоение
List
значения возвращаемого функциейCreate
- Вывод текста
Список:
в консоль - Вызов процедуры
See
с параметромList
- Вызов процедуры
MoveToBegin
с параметромList
- Вывод текста
Отрицательные в начале:
в консоль - Вызов процедуры
See
с параметромList
- Конец программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д