node_list.h
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:4k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  node_list.h
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #ifndef LEDA_NODE_LIST_H
  12. #define LEDA_NODE_LIST_H
  13. //------------------------------------------------------------------------------
  14. // node_list
  15. //------------------------------------------------------------------------------
  16. #include <LEDA/graph.h>
  17. /*{Manpage {node_list} {} {Lists of Nodes} }*/
  18. class node_list : public c_obj_list {
  19. /*{Mdefinition
  20. An instance of the data type name is a doubly linked list of nodes. It
  21. is implemented more efficiently than the general list type $list<node>$ 
  22. (ref{Linear Lists}). However, it can only be used with the 
  23. restriction that every node is contained in at most one name.  }*/
  24. // private copy constructor (node_list's cannot be copied)
  25.   node_list(const node_list& ) {}
  26. public:
  27. /*{Mcreation L }*/
  28.   node_list() {};
  29. /*{Mcreate    introduces a variable var of type name and initializes
  30.                it with the empty list. }*/
  31. /*{Moperations 2 4.5 }*/
  32.   static void del_node(node v) { aux_link(v)->del_item(); }
  33.   void append(node v) { c_obj_list::append(aux_link(v)); }
  34. /*{Mop   appends $v$ to list var. }*/
  35.   void push(node v)   { c_obj_list::push(aux_link(v)); }
  36. /*{Mop   adds $v$ at the front of var. }*/
  37.   void insert(node v, node w) 
  38.                       { c_obj_list::insert(aux_link(v),aux_link(w)); }
  39. /*{Mop   inserts $v$ after $w$ into var.\
  40.           precond $w in L$. }*/
  41.   node pop()          { return node(aux_link(c_obj_list::pop())); }
  42. /*{Mop   deletes the first node from var and returns it.\
  43.           precond var is not empty. }*/
  44.   void del(node v)    { c_obj_list::del(aux_link(v)); }
  45. /*{Mop   deletes $v$ from var.\
  46.           precond $v in L$. }*/
  47.   bool member(node v)  const { return aux_link(v)->succ_link != nil; }
  48. /*{Mop    returns true if $v in L$ and false otherwise. }*/
  49.   bool operator()(node v) const { return member(v); }
  50. /*{Mfunop    returns true if $v in L$ and false otherwise. }*/
  51.   node head() const { return node(aux_link(c_obj_list::first())); }
  52.   node first()const { return node(aux_link(c_obj_list::first())); }
  53. /*{Mop    returns the first node in var (nil if var is empty).}*/
  54.   node tail() const { return node(aux_link(c_obj_list::last()));  }
  55.   node last() const { return node(aux_link(c_obj_list::last()));  }
  56. /*{Mop    returns the last node in var (nil if var is empty).}*/
  57.   node succ(node v) const
  58.   { return node(aux_link(c_obj_list::succ(aux_link(v)))); }
  59. /*{Mop    returns the successor of $v$ in var.\ 
  60.            precond $v in L$. }*/
  61.   node pred(node v) const
  62.   { return node(aux_link(c_obj_list::pred(aux_link(v)))); }
  63. /*{Mop    returns the predecessor of $v$ in var.\ 
  64.            precond $v in L$. }*/
  65.   node cyclic_succ(node v) const
  66.   { return node(aux_link(c_obj_list::cyclic_succ(aux_link(v)))); }
  67. /*{Mop    returns the cyclic successor of $v$ in var.\ 
  68.            precond $v in L$. }*/
  69.   node cyclic_pred(node v) const
  70.   { return node(aux_link(c_obj_list::cyclic_pred(aux_link(v)))); }
  71. /*{Mop    returns the cyclic predecessor of $v$ in var.\ 
  72.            precond $v in L$. }*/
  73. // iteration
  74.   node first_item() const { return first(); }
  75.   node last_item()  const { return last(); }
  76.   void loop_to_succ(GenPtr& x) const { x = succ(node(x)); }
  77.   void loop_to_pred(GenPtr& x) const { x = pred(node(x)); }
  78.   GenPtr forall_loop_test(GenPtr x, node& v) const { return v = node(x); }
  79. #if defined(__ELSE_SCOPE_BUG__)
  80.   GenPtr forall_loop_item;
  81.   GenPtr& Forall_Loop_Item() const { return (GenPtr&)forall_loop_item; }
  82. #endif
  83. };
  84. /*{Mtext
  85. bigskip
  86. {bf forall}($x,L$)
  87. ${$ ``the elements of $L$ are successively assigned to $x$'' $}$ }*/
  88. #endif