Надо довести до совершенство решение задачи, тема который для меня тёмный лес:
Написать программу, содержащую процедуру, которая меняет местами первый
и второй элементы не пустого списка.
Если элементы не найдены, то выдать на экран соответствующие сообщение.
задача уже решалась на форуме, однако хотелось бы увидеть оптимальное решение, учитывая возможности FP
моё решение
{$mode objfpc}
type
		data=^node;
		node=record i:integer; next:data; end;
function ch(var p:data):boolean;
var wp:data;
begin
		if p^.next<>nil then begin
				wp:=p^.next; p^.next:=wp^.next; wp^.next := p;
				p:=wp;
				ch:=true;
		end else
				ch:=false;
end;
procedure  print(const p:data);
var p0:data;
begin
		p0:=p;
		if (p0^.next<>nil) then begin
				repeat
						writeln(p0^.i); p0:=p0^.next;
				until (p0^.next=nil);
				writeln(p0^.i);
		end;
end;
procedure  init(var p:data);
var	 p0,p1:data;	 i:integer;
begin
		new(p);
		p^.next:=nil; p^.i:=0;
		p0:=p;
		readln(i);
		if i<>0 then begin
				p0^.i:=i;
				readln(i);
				while i<>0 do begin
						new(p1);
						p1^.i:=i; p1^.next:=nil;
						p0^.next:=p1;
						p0:=p1;
						readln(i);
				end;
		end;
end;
procedure free(p:data);
var	 p0:data;
begin
		repeat
				p0:=p^.next;
				dispose(p);
				p:=p0;
		until (p=nil);
end;
var
		sp:data;
begin
		init(sp);
		if ch(sp) then print(sp) else writeln('error');
		free(sp);
end.
 заранее благодарен.
 
 
  
        	





 
 
 
