{$mode objfpc} unit listunit2; interface type PList=^TList; TList=record pdata:pointer; pprev,pnext:plist; end; TListAction=procedure(p:plist); TDisposeAction=procedure(p:plist); function CreateElement(pdata:pointer):PList; function AddFirstElement(var PH:Plist; p:plist):plist; function AddLastElement(var PH:Plist; p:plist):plist; function InsertElement(pprevE:Plist; p:plist):plist; procedure ListAction(PH:Plist; action:TListAction); procedure ListActionReverse(PH:Plist; action:TListAction);// нерекурсивно function DeleteFirstElement(var PH:Plist):plist; function DeleteLastElement(var PH:Plist):plist; function DeleteElement(p:Plist):plist; procedure DisposeList(var PH:Plist; DisposeAction:TDisposeAction=nil); implementation { function CreateElement(pdata:pointer):PList; begin new(result); result^.pdata:=pdata; result^.pnext:=nil; end; function AddFirstElement(var PH:Plist; p:plist):plist; begin end; function AddLastElement(var PH:Plist; p:plist):plist; var _ph:plist; begin result:=p; if ph=nil then begin ph:=p; exit; end; _ph:=ph; while _ph^.pnext<>nil do _ph:=_ph^.pnext; _ph^.pnext:=p; end; function InsertElement(pprevE:Plist; p:plist):plist; begin end; procedure ListAction(PH:Plist; action:TListAction); begin while ph<>nil do begin action(ph); ph:=ph^.pnext; end; action(nil); end; procedure ListActionReverse(PH:Plist; action:TListAction); begin if ph=nil then begin action(nil); exit; end; // ??? ListActionReverse(ph^.pnext,action); action(ph); end; function DeleteFirstElement(var PH:Plist):plist; begin end; function DeleteLastElement(var PH:Plist):plist; begin end; function DeleteElement(pprevE:Plist):plist; begin end; procedure DisposeList(var PH:Plist; DisposeAction:TDisposeAction=nil); begin if ph=nil then begin if DisposeAction<>nil then disposeAction(nil); exit; end; DisposeList(ph^.pnext, DisposeAction); if DisposeAction<>nil then DisposeAction(ph^.pdata); Dispose(ph); ph:=nil; end; } end.