unit list2; interface type list_info_type=integer; pos_type=^link_type; link_type=record info:list_info_type; next:pos_type; end; list_type=record anchor:pos_type end;
procedure list_init(var list:list_type); function list_anchor(list:list_type):pos_type; function list_end(list:list_type):pos_type; function list_next(list:list_type;pos:pos_type):pos_type; function list_prev(list:list_type;pos:pos_type):pos_type; procedure list_insert(var list:list_type;pos:pos_type;x:list_info_type); procedure list_delete(var list:list_type;var pos:pos_type); procedure list_retrieve(list:list_type;pos:pos_type;var x:list_info_type); function list_is_empty(list:list_type):boolean; procedure list_update(var list:list_type;pos:pos_type;x:list_info_type);
implementation
procedure list_init(var list:list_type); begin new(list.anchor); list.anchor^.next:=nil end;
function list_anchor(list:list_type):pos_type; begin list_anchor:=list.anchor end;
function list_end(list:list_type):pos_type; begin list_end:=nil end;
function list_next(list:list_type;pos:pos_type):pos_type; begin list_next:=pos^.next end;
function list_prev(list:list_type;pos:pos_type):pos_type; var q:pos_type; begin q:=list_anchor(list); while list_next(list,q)<>pos do q:=list_next(list,q); list_prev:=q; end;
procedure list_insert(var list:list_type;pos:pos_type;x:list_info_type); var q:pos_type; begin new(q); q^.info:=x; q^.next:=pos^.next; pos^.next:=q; end;
procedure list_delete(var list:list_type;var pos:pos_type); var q:pos_type; begin q:=list_anchor(list); while list_next(list,q)<>pos do q:=list_next(list,q); q^.next:=pos^.next; dispose(pos); pos:=q^.next; end;
procedure list_retrieve(list:list_type;pos:pos_type;var x:list_info_type); begin x:=pos^.info; end;
function list_is_empty(list:list_type):boolean; begin list_is_empty:=list.anchor^.next=nil; end;
procedure list_update(var list:list_type;pos:pos_type;x:list_info_type); begin pos^.info:=x end;
begin end.
|