{$mode objfpc} unit listunit2c; 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(PH:Plist; 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(PH:PList; 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; ph^.pnext:=ph; ph^.pprev:=ph; exit; end; p^.pnext:=ph; p^.pprev:=ph^.pprev; p^.pprev^.pnext:=p; ph^.pprev:=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.