Паскаль — Клёвый код https://coolcode.ru Скриптописание и кодинг Sat, 23 Apr 2016 09:36:51 +0000 ru-RU hourly 1 https://wordpress.org/?v=5.8.10 https://coolcode.ru/wp-content/uploads/2015/10/YO1-150x150.png Паскаль — Клёвый код https://coolcode.ru 32 32 Решаем задачи Абрамян на Паскале. Pointer80 https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer80/ https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer80/#respond Mon, 25 Apr 2016 11:05:09 +0000 http://coolcode.ru/?p=6425

Pointer80. Даны указатели $$P_1$$ и $$P_2$$ на барьерный и текущий элементы непустого двусвязного списка, причем текущий элемент не совпадает с барьерным.Используя тип TListB (см. задание Pointer74), описать функцию LBDeleteCurrent($$L$$) целого типа, удаляющую из списка $$L$$ текущий элемент и возвращающую его значение ($$L$$ — входной и выходной параметр типа TListB). Текущим становится следующий элемент или, если следующий элемент является барьерным, предыдущий элемент списка. Функция также освобождает память, занимаемую удаленным элементом. Если текущим элементом является барьерный элемент, то функция не выполняет никаких действий и возвращает $$0$$. С помощью этой функции, а также функции IsBarrier из задания Pointer78, удалить из исходного списка пять элементов (или все элементы, если их менее пяти) и вывести их значения. Вывести также новый адрес текущего элемента списка.

Решение:

program Pointer80;
type
  PNode=^TNode;
  TNode=record
    Data: Integer;
    Next: PNode;
    Prev: PNode;
  end;
  TListB=record
    Barrier,Current:PNode;
  end;

function CycleList():PNode;
var
 P1,pt1,pt2,temp:PNode;
 i,N:integer;
begin
 Write('NumEl:');
 Readln(N);
 new(p1);
 Write('num: ');
 Readln(P1^.Data);
 pt2:=p1;

 for i:=1 to N-1 do
  begin
   new(pt1);
   Write('num: ');
   Readln(pt1^.Data);
   pt1.Prev:=pt2;
   pt2.Next:=pt1;
   pt2:=pt2.Next;
  end;
 pt2.Next:=nil;

 new(temp);
 temp.Data:=0;
 temp.Next:=P1;
 temp.Prev:=Pt2;
 P1.Prev:=temp;
 Pt2.Next:=temp;
 CycleList:=temp;
end;

function IsBarrier(L:TListB):boolean;
begin
 if L.Current=L.Barrier then IsBarrier:=True
 else IsBarrier:=False;
end;

function LBDeleteCurrent(var L:TListB):integer;
var
 temp:PNode;
begin
 LBDeleteCurrent:=L.Current.Data;
 if not(IsBarrier(L)) then
  begin
   L.Current.Prev.Next:=L.Current.Next;
   L.Current.Next.Prev:=L.Current.Prev;
   temp:=L.Current;
   if L.Current.Next<>L.Barrier then L.Current:=L.Current.Next
   else L.Current:=L.Current.Prev;
   Dispose(temp);
  end;
end;

var
 P1,P2:PNode;
 a:^Word;
 L:TListB;
 i:integer;

begin
 P1:=CycleList();
 P2:=P1.Next.Next;

 L.Barrier:=P1;
 L.Current:=P2;

 For i:=1 to 5 do Writeln(LBDeleteCurrent(L));

 a:=Addr(L.Current);
 Writeln('current: ',a^);
end.

 

Другие задачи из раздела Pointer можно посмотреть здесь.

]]>
https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer80/feed/ 0
Решаем задачи Абрамян на Паскале. Pointer79 https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer79/ https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer79/#respond Sun, 24 Apr 2016 10:55:38 +0000 http://coolcode.ru/?p=6422

Pointer79. Даны указатели $$P_1$$ и $$P_2$$ на барьерный и текущий элементы двусвязного списка. Используя тип TListB (см. задание Pointer74), описать процедуры LBToLast($$L$$) (делает текущим последний элемент списка $$L$$), LBToPrev($$L$$) (делает текущим в списке $$L$$ предыдущий элемент) и функцию LBGetData($$L$$) целого типа (возвращает значение текущего элемента списка $$L$$). Параметр $$L$$ имеет тип TListB; в процедурах LBToLast и LBToPrev он является входным и выходным. С помощью этих процедур и функций, а также с использованием функции IsBarrier из задания Pointer78, вывести все четные значения элементов исходного списка, просматривая список с конца. Вывести также количество элементов в списке. Барьерный элемент при подсчете элементов не учитывать.

Решение:

program Pointer79;
type
  PNode=^TNode;
  TNode=record
    Data: Integer;
    Next: PNode;
    Prev: PNode;
  end;
  TListB=record
    Barrier,Current:PNode;
  end;

function CycleList():PNode;
var
 P1,pt1,pt2,temp:PNode;
 i,N:integer;
begin
 Write('NumEl:');
 Readln(N);
 new(p1);
 Write('num: ');
 Readln(P1^.Data);
 pt2:=p1;

 for i:=1 to N-1 do
  begin
   new(pt1);
   Write('num: ');
   Readln(pt1^.Data);
   pt1.Prev:=pt2;
   pt2.Next:=pt1;
   pt2:=pt2.Next;
  end;
 pt2.Next:=nil;

 new(temp);
 temp.Data:=0;
 temp.Next:=P1;
 temp.Prev:=Pt2;
 P1.Prev:=temp;
 Pt2.Next:=temp;
 CycleList:=temp;
end;

procedure LBToLast(var L:TListB);
begin
 L.Current:=L.Barrier.Prev;
end;

procedure LBToPrev(var L:TListB);
begin
 L.Current:=L.Current.Prev;
end;

function LBGetData (L:TListB):integer;
begin
 LBGetData:=L.Current.Data;
end;

function IsBarrier(L:TListB):boolean;
begin
 if L.Current=L.Barrier then IsBarrier:=True
 else IsBarrier:=False;
end;

var
 P1,P2:PNode;
 a:^Word;
 L:TListB;
 len:integer;

begin
 P1:=CycleList();
 P2:=P1.Next.Next;

 L.Barrier:=P1;
 L.Current:=P2;

 LBToLast(L);
 Len:=0;

 While not(IsBarrier(L)) do
  begin
   inc(Len);
   if not(odd(LBGetData(L))) then Writeln(LBGetData(L));
   LBToPrev(L);
  end;

 Writeln('Len:',Len);

 a:=Addr(L.Current);
 Writeln('current: ',a^);
end.

 

Другие задачи из раздела Pointer можно посмотреть здесь.

]]>
https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer79/feed/ 0
Решаем задачи Абрамян на Паскале. Pointer78 https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer78/ https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer78/#respond Sat, 23 Apr 2016 10:37:28 +0000 http://coolcode.ru/?p=6420

Pointer78. Даны указатели $$P_1$$ и $$P_2$$ на барьерный и текущий элементы двусвязного списка. Используя тип TListB (см. задание Pointer74), описать процедуры LBToFirst($$L$$) (делает текущим первый элемент списка $$L$$), LBToNext($$L$$) (делает текущим в списке $$L$$ следующий элемент), LBSetData($$L$$, $$D$$) (присваивает текущему элементу списка $$L$$ значение $$D$$ целого типа, если данный элемент не является барьерным) и функцию IsBarrier($$L$$) логического типа (возвращает True, если текущий элемент списка $$L$$ является его барьерным элементом, и False в противном случае). Параметр $$L$$ имеет тип TListB; в процедурах LBToFirst и LBToNext он является входным и выходным. С помощью этих процедур и функций присвоить нулевые значения элементам исходного списка с нечетными номерами и вывести количество элементов в списке, а также новый адрес текущего элемента списка. Барьерный элемент при подсчете элементов не учитывать.

Решение:

program Pointer78;
type
  PNode=^TNode;
  TNode=record
    Data: Integer;
    Next: PNode;
    Prev: PNode;
  end;
  TListB=record
    Barrier,Current:PNode;
  end;

function CycleList():PNode;
var
 P1,pt1,pt2,temp:PNode;
 i,N:integer;
begin
 Write('NumEl:');
 Readln(N);
 new(p1);
 Write('num: ');
 Readln(P1^.Data);
 pt2:=p1;

 for i:=1 to N-1 do
  begin
   new(pt1);
   Write('num: ');
   Readln(pt1^.Data);
   pt1.Prev:=pt2;
   pt2.Next:=pt1;
   pt2:=pt2.Next;
  end;
 pt2.Next:=nil;

 new(temp);
 temp.Data:=0;
 temp.Next:=P1;
 temp.Prev:=Pt2;
 P1.Prev:=temp;
 Pt2.Next:=temp;
 CycleList:=temp;
end;

procedure LBToFirst(var L:TListB);
begin
 L.Current:=L.Barrier.Next;
end;

procedure LBToNext(var L:TListB);
begin
 L.Current:=L.Current.Next;
end;

procedure LBSetData (L:TListB; D:integer);
begin
 if L.Current<>L.Barrier then L.Current^.Data:=D;
end;

function IsBarrier(L:TListB):boolean;
begin
 if L.Current=L.Barrier then IsBarrier:=True
 else IsBarrier:=False;
end;

var
 P1,P2:PNode;
 a:^Word;
 L:TListB;
 len:integer;

begin
 P1:=CycleList();
 P2:=P1.Next.Next;

 L.Barrier:=P1;
 L.Current:=P2;

 LBToFirst(L);
 Len:=0;

 While not(IsBarrier(L)) do
  begin
   inc(Len);
   if odd(len) then  LBSetData(L,0);
   LBToNext(L);
  end;

 Writeln('Len:',Len);

 a:=Addr(L.Current);
 Writeln('current: ',a^);
end.

 

Другие задачи из раздела Pointer можно посмотреть здесь.

]]>
https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer78/feed/ 0
Задача на строки https://coolcode.ru/zadacha-na-stroki/ https://coolcode.ru/zadacha-na-stroki/#comments Sat, 23 Apr 2016 09:36:51 +0000 http://coolcode.ru/?p=8177

Дана последовательност, содержащая от 2 до 30 слов, в каждом из которых от 2 до 10 строчных букв; между соседними словами — запятая, за последним словом — точка . напечатать все слова последователоьности, которые отличны от последнего слова , предварительно преобразовав каждое из них по след правилу: удалить из слова первую букву.

program Strins;
var S,LastWord,Word:string;
ms:array[1..30] of string;
dot,i:integer;
begin
  write('S:');
  readln(S);
  dot:=pos('.',S);
  i:=dot;
  while (s[i]<>',') do dec(i);

 LastWord:=copy(S,i+1,dot-i-1);
 i:=0;
 Word:='';
 while i<dot do
  begin
   inc(i);
   if S[i]<>',' then Word:=Word+S[i]
   else
    begin
     if Word<>LastWord then
      begin
       delete(Word,1,1);
       Writeln(Word);
      end;
     Word:='';
    end;
  end;
end.

 

]]>
https://coolcode.ru/zadacha-na-stroki/feed/ 2
Решаем задачи Абрамян на Паскале. Pointer77 https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer77/ https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer77/#comments Fri, 22 Apr 2016 10:31:22 +0000 http://coolcode.ru/?p=6416

Pointer77. Даны указатели $$P_1$$ и $$P_2$$ на барьерный и текущий элементы двусвязного списка. Также даны пять чисел. Используя тип TListB (см. задание Pointer74), описать процедуру LBInsertAfter($$L$$, $$D$$), которая вставляет новый элемент со значением $$D$$ после текущего элемента списка $$L$$ ($$L$$ — входной и выходной параметр типа TListB, $$D$$ — входной параметр целого типа). Вставленный элемент становится текущим. С помощью этой процедуры вставить пять данных чисел в исходный список и вывести новый адрес его текущего элемента.

Решение:

program Pointer77;
type
  PNode=^TNode;
  TNode=record
    Data: Integer;
    Next: PNode;
    Prev: PNode;
  end;
  TListB=record
    Barrier,Current:PNode;
  end;

procedure NewListB(var L:TListB);
begin
 new(L.Barrier);
 L.Barrier.Data:=0;
 L.Barrier.Next:=L.Barrier;
 L.Barrier.Prev:=L.Barrier;
 L.Current:=L.Barrier;
end;

procedure LBInsertAfter(var L:TListB; D:integer);
var
 temp:PNode;
begin
 new(temp);
 temp.Data:=D;
 temp.Prev:=L.Current;
 temp.Next:=L.Current.Next;

 L.Current.Next.Prev:=temp;
 L.Current.Next:=temp;

 L.Current:=temp;
end;

var
 P1,P2:PNode;
 D,i:integer;
 a:^Word;
 L:TListB;

begin
 NewListB(L);
 P1:=L.Barrier;
 P2:=L.Current;

 L.Barrier:=P1;
 L.Current:=P2;

 for i:=1 to 5 do
  begin
   write('D: ');
   Readln(D);
   LBInsertAfter(L,D);
  end;

 a:=Addr(L.Current);
 Writeln('current: ',a^);
end.

Другие задачи из раздела Pointer можно посмотреть здесь.

]]>
https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer77/feed/ 2
Решаем задачи Абрамян на Паскале. Pointer76 https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer76/ https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer76/#respond Thu, 21 Apr 2016 10:22:29 +0000 http://coolcode.ru/?p=6414

Pointer76. Даны указатели $$P_1$$ и $$P_2$$ на барьерный и текущий элементы двусвязного списка. Также даны пять чисел. Используя тип TListB (см. задание Pointer74), описать процедуру LBInsertBefore($$L$$, $$D$$), которая вставляет новый элемент со значением $$D$$ перед текущим элементом списка $$L$$ ($$L$$ — входной и выходной параметр типа TListB, $$D$$ — входной параметр целого типа). Вставленный элемент становится текущим. С помощью этой процедуры вставить пять данных чисел в исходный список и вывести новый адрес его текущего элемента.

Решение:

program Pointer76;
type
  PNode=^TNode;
  TNode=record
    Data: Integer;
    Next: PNode;
    Prev: PNode;
  end;
  TListB=record
    Barrier,Current:PNode;
  end;


procedure NewListB(var L:TListB);
begin
 new(L.Barrier);
 L.Barrier.Data:=0;
 L.Barrier.Next:=L.Barrier;
 L.Barrier.Prev:=L.Barrier;
 L.Current:=L.Barrier;
end;

procedure LBInsertBefore(var L:TListB; D:integer);
var
 temp:PNode;
begin
 new(temp);
 temp.Data:=D;
 temp.Next:=L.Current;
 temp.Prev:=L.Current.Prev;

 L.Current.Prev.Next:=temp;
 L.Current.Prev:=temp;

 L.Current:=temp;
end;

var
 P1,P2:PNode;
 D,i:integer;
 a:^Word;
 L:TListB;

begin
 NewListB(L);
 P1:=L.Barrier;
 P2:=L.Current;

 L.Barrier:=P1;
 L.Current:=P2;

 for i:=1 to 5 do
  begin
   write('D: ');
   Readln(D);
   LBInsertBefore(L,D);
  end;

 a:=Addr(L.Current);
 Writeln('current: ',a^);
end.

 

Другие задачи из раздела Pointer можно посмотреть здесь.

]]>
https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer76/feed/ 0
Решаем задачи Абрамян на Паскале. Pointer75 https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer75/ https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer75/#respond Wed, 20 Apr 2016 09:06:19 +0000 http://coolcode.ru/?p=6412

Pointer75. Даны указатели $$P_1$$ и $$P_2$$ на барьерный и текущий элементы двусвязного списка. Также дано число $$N$$ $$(>0)$$ и набор из $$N$$ чисел. Используя тип TListB (см. задание Pointer74), описать процедуру LBInsertFirst($$L$$, $$D$$), которая добавляет новый элемент со значением $$D$$ в начало списка $$L$$ ($$L$$ — входной и выходной параметр типа TListB, $$D$$ — входной параметр целого типа). Добавленный элемент становится текущим. С помощью этой процедуры добавить в начало исходного списка данный набор чисел (добавленные числа будут располагаться в списке в обратном порядке) и вывести адрес текущего элемента полученного списка.

Решение:

program Pointer75;
type
  PNode=^TNode;
  TNode=record
    Data: Integer;
    Next: PNode;
    Prev: PNode;
  end;
  TListB=record
    Barrier,Current:PNode;
  end;

procedure NewListB(var L:TListB);
begin
 new(L.Barrier);
 L.Barrier.Data:=0;
 L.Barrier.Next:=L.Barrier;
 L.Barrier.Prev:=L.Barrier;
 L.Current:=L.Barrier;
end;

procedure LBInsertFirst(var L:TListB; D:integer);
var
 temp:PNode;
begin
 new(temp);
 temp.Data:=D;
 temp.Prev:=L.Barrier;
 temp.Next:=L.Barrier.Next;

 L.Barrier.Next.Prev:=temp;
 L.Barrier.Next:=temp;

 L.Current:=temp;
end;

var
 P1,P2:PNode;
 N,D,i:integer;
 a:^Word;
 L:TListB;

begin
 NewListB(L);
 P1:=L.Barrier;
 P2:=L.Current;
 //дальше всё по условию:
 L.Barrier:=P1;
 L.Current:=P2;

 Write('N: ');
 Readln(N);
 for i:=1 to N do
  begin
   write('D: ');
   Readln(D);
   LBInsertFirst(L,D);
  end;
 a:=Addr(L.Current);
 Writeln('current: ',a^);
end.

Другие задачи из раздела Pointer можно посмотреть здесь.

]]>
https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer75/feed/ 0
Решаем задачи Абрамян на Паскале. Pointer74 https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer74/ https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer74/#respond Tue, 19 Apr 2016 06:16:50 +0000 http://coolcode.ru/?p=6408

Pointer74. Даны указатели $$P_1$$ и $$P_2$$ на барьерный и текущий элементы двусвязного списка (о списке с барьерным элементом см. задание Pointer70). Также дано число $$N$$ $$(>0)$$ и набор из $$N$$ чисел. Описать тип TListB — запись с полями Barrier и Current типа PNode (поля указывают соответственно на барьерный и текущий элементы списка) — и процедуру LBInsertLast($$L$$, $$D$$), которая добавляет новый элемент со значением $$D$$ в конец списка $$L$$ ($$L$$ — входной и выходной параметр типа TListB, $$D$$ — входной параметр целого типа). Добавленный элемент становится текущим. С помощью этой процедуры добавить в конец исходного списка данный набор чисел (в том же порядке) и вывести адрес текущего элемента полученного списка.

Решение:

program Pointer74;
type
  PNode=^TNode;
  TNode=record
    Data: Integer;
    Next: PNode;
    Prev: PNode;
  end;
  TListB=record
    Barrier,Current:PNode;
  end;

procedure NewListB(var L:TListB);
begin
 new(L.Barrier);
 L.Barrier.Data:=0;
 L.Barrier.Next:=L.Barrier;
 L.Barrier.Prev:=L.Barrier;
 L.Current:=L.Barrier;
end;

procedure LBInsertLast(var L:TListB; D:integer);
var
 temp:PNode;
begin
 new(temp);
 temp.Data:=D;
 temp.Next:=L.Barrier;
 temp.Prev:=L.Barrier.Prev;
 L.Barrier.Prev.Next:=temp;
 L.Barrier.Prev:=temp;
 L.Current:=temp;
end;

var
 P1,P2:PNode;
 N,D,i:integer;
 a:^Word;
 L:TListB;

begin
 NewListB(L);
 P1:=L.Barrier;
 P2:=L.Current;
 //С этого момента, всё согласно заданию
 L.Barrier:=P1;
 L.Current:=P2;

 Write('N: ');
 Readln(N);
 for i:=1 to N do
  begin
   write('D: ');
   Readln(D);
   LBInsertLast(L,D);
  end;

 a:=Addr(L.Current);
 Writeln('current: ',a^);
end.

Другие задачи из раздела Pointer можно посмотреть здесь.

]]>
https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer74/feed/ 0
Решаем задачи Абрамян на Паскале. Pointer73 https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer73/ https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer73/#respond Mon, 18 Apr 2016 06:09:10 +0000 http://coolcode.ru/?p=6406

Pointer73. Даны указатели $$P_1$$ и $$P_2$$ на барьерные элементы двух двусвязных списков (о списке с барьерным элементом см. задание Pointer70). Объединить исходные списки, связав конец первого и начало второго списка (барьерным элементом объединенного списка должен остаться барьерный элемент второго списка). Вывести указатели на первый и последний элементы объединенного списка (если объединенный список является пустым, то дважды вывести указатель на его барьерный элемент). После удаления лишнего барьерного элемента освободить занимаемую им память.

Решение:

program Pointer73;
type
  PNode=^TNode;
  TNode=record
    Data: Integer;
    Next: PNode;
    Prev: PNode;
  end;

function CycleList():PNode;
var
 P1,pt1,pt2,temp:PNode;
 i,N:integer;
begin
 Write('NumEl:');
 Readln(N);
 new(p1);
 Write('num: ');
 Readln(P1^.Data);
 pt2:=p1;

 for i:=1 to N-1 do
  begin
   new(pt1);
   Write('num: ');
   Readln(pt1^.Data);
   pt1.Prev:=pt2;
   pt2.Next:=pt1;
   pt2:=pt2.Next;
  end;
 pt2.Next:=nil;


 new(temp);
 temp.Data:=0;
 temp.Next:=P1;
 temp.Prev:=Pt2;
 P1.Prev:=temp;
 Pt2.Next:=temp;
 CycleList:=temp;
end;

procedure CombineCycleList(var P1,P2:PNode);
begin
 P1.Prev.Next:=P2.Next;
 P2.Next.Prev:=P1.Prev;

 P2.Next:=P1.Next;
 P1.Next.Prev:=P2;

 Dispose(P1);

 P1:=P2.Next;
 P2:=P2.Prev;
end;


var
 P1,P2:PNode;
 a:^Word;
begin
 P1:=CycleList();
 P2:=CycleList();


 CombineCycleList(P1,P2);

 a:=Addr(P1);
 Writeln('begin: ',a^);

 a:=Addr(P2);
 Writeln('end: ',a^);
end.

 

Другие задачи из раздела Pointer можно посмотреть здесь.

]]>
https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer73/feed/ 0
Решаем задачи Абрамян на Паскале. Pointer72 https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer72/ https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer72/#respond Sun, 17 Apr 2016 10:35:45 +0000 http://coolcode.ru/?p=6402

Pointer72. Даны указатели $$P_1$$ и $$P_2$$ на барьерные элементы двух двусвязных списков (о списке с барьерным элементом см. задание Pointer70). Объединить исходные списки, связав конец первого и начало второго списка (барьерным элементом объединенного списка должен остаться барьерный элемент первого списка). Вывести указатели на первый и последний элементы объединенного списка (если объединенный список является пустым, то дважды вывести указатель на его барьерный элемент). После удаления лишнего барьерного элемента освободить занимаемую им память.

Решение:

program Pointer72;
type
  PNode=^TNode;
  TNode=record
    Data: Integer;
    Next: PNode;
    Prev: PNode;
  end;

function CycleList():PNode;
var
 P1,pt1,pt2,temp:PNode;
 i,N:integer;
begin
 Write('NumEl:');
 Readln(N);
 new(p1);
 Write('num: ');
 Readln(P1^.Data);
 pt2:=p1;
 for i:=1 to N-1 do
  begin
   new(pt1);
   Write('num: ');
   Readln(pt1^.Data);
   pt1.Prev:=pt2;
   pt2.Next:=pt1;
   pt2:=pt2.Next;
  end;
 pt2.Next:=nil;
 new(temp);
 temp.Data:=0;
 temp.Next:=P1;
 temp.Prev:=Pt2;
 P1.Prev:=temp;
 Pt2.Next:=temp;
 CycleList:=temp;
end;

procedure CombineCycleList(var P1,P2:PNode);
begin
 P1.Prev.Next:=P2.Next;
 P2.Next.Prev:=P1.Prev;

 P1.Prev:=P2.Prev;
 P2.Prev.Next:=P1;

 Dispose(P2);
 P2:=P1.Prev;
 P1:=P1.Next;
end;


var
 P1,P2:PNode;
 a:^Word;
begin
 P1:=CycleList();
 P2:=CycleList();

 CombineCycleList(P1,P2);

 a:=Addr(P1);
 Writeln('begin: ',a^);

 a:=Addr(P2);
 Writeln('end: ',a^);
end.

 

Другие задачи из раздела Pointer можно посмотреть здесь.

]]>
https://coolcode.ru/reshaem-zadachi-abramyan-na-paskale-pointer72/feed/ 0