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