Двунаправленные списки - Pascal
Формулировка задачи:
Помогите, пожалуйста, с решением задачи на двунаправленные списки
Дан двунаправленный список целых чисел. Переставить элементы списка так, чтобы сначала следовали элементы, являющиеся числами Фибоначчи, а затем остальные элементы списка.
Решение задачи: «Двунаправленные списки»
textual
Листинг программы
program spis; uses crt; type pnode=^tnode; tnode=record val:integer; pred,next:pnode; end; var first,last,temp,temp2:pnode; i,n,x,g:integer; y:array[1..10] of integer; procedure vvod(var first1,last1:pnode; xx:integer); begin if first1=nil then begin new(first1); first1^.next:=nil; first1^.pred:=nil; last1:=first1; end else begin new(last1^.next); last1^.next^.pred:=last1; last1:=last1^.next; last1^.next:=nil; end; last1^.val:=xx; end; procedure fib(m:integer); var i,j,k:integer; temp,temp2:pnode; begin i:=1; j:=1; k:=1; while k<m do begin k:=j+i; i:=j; j:=k; end; if k=m then begin while temp^.next<>nil do begin temp:=first; if temp^.next^.val=m then begin temp2:=temp^.next; temp2^.pred:=temp^.pred; temp^.next:=temp2^.next; temp2^.next:=temp; temp^.pred:=temp2; end; temp:=temp^.next; end; end; end; procedure vivod(first1:pnode); begin if first1=nil then begin writeln('Spisok pust'); exit; end; while first1<>nil do begin writeln(first1^.val); first1:=first1^.next; end; end; begin clrscr; write('n='); readln(n); for i:=1 to n do begin write('x='); readln(x); vvod(first,last,x); y[i]:=x; end; for i:=1 to n do begin fib(y[i]); end; vivod(first); readln; end.
Объяснение кода листинга программы
- В программе используется структура данных двунаправленный список (дискретный массив).
- Переменная
first
инициализируется как первый элемент списка, а переменнаяlast
инициализируется как последний элемент списка. - Функция
vvod
добавляет новый узел в начало списка. Если список пуст, то создается новый узел и он становится первым элементом списка. Указательfirst
указывает на новый узел, а указательlast
указывает на предыдущий узел. Значение нового узла равно значению переданного аргументаxx
. - Функция
fib
вычисляет последовательность Фибоначчи. Она использует три переменныеi
,j
иk
для хранения текущего, предыдущего и следующего чисел в последовательности. Покаk
меньшеm
, значенияi
,j
иk
обновляются. Еслиk
равноm
, то последовательность завершена и функция возвращает значениеm
. - Функция
vivod
выводит список на экран. Она проходит по списку от начала до конца и выводит значение каждого узла. - Основная программа создает список, добавляет в него
n
элементов, вычисляет последовательность Фибоначчи для каждого элемента и выводит список на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д