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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  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_LIST_H
  12. #define LEDA_LIST_H
  13. /*{Manpage {list} {E} {Linear Lists}}*/
  14. #include <LEDA/impl/dlist.h>
  15. template<class E> 
  16. class list : public dlist 
  17. {
  18. /*{Mdefinition
  19. An instance $L$ of the parameterized data type name is a sequence of items
  20. ($list_item$). Each item in $L$ contains an element of data type $E$, called
  21. the element type of $L$. The number of items in $L$ is called the length of $L$.
  22. If $L$ has length zero it is called the empty list. In the sequel $<x>$ is 
  23. used to denote a list item containing the element $x$ and $L[i]$ is used to 
  24. denote the contents of list item $i$ in $L$.}*/
  25. int  (*cmp_ptr)(const E&, const E&); // pointer to user supplied cmp function 
  26. int  (*ord_ptr)(const E&);           // pointer to user supplied ord function 
  27. void (*app_ptr)(E&);                 // pointer to user supplied apply function 
  28. int  int_type() const { return LEDA_INT_TYPE(E); }
  29. int  cmp(GenPtr x, GenPtr y) const 
  30. { if (cmp_ptr) 
  31.      return (*cmp_ptr)(LEDA_ACCESS(E,x),LEDA_ACCESS(E,y));
  32.   else 
  33.      return LEDA_COMPARE(E,x,y); 
  34. }
  35. int  ord(GenPtr x)  const { return (*ord_ptr)(LEDA_ACCESS(E,x)); }
  36. void app(GenPtr& x) const { (*app_ptr)(LEDA_ACCESS(E,x)); }
  37. void clear_el(GenPtr& x)     const { LEDA_CLEAR(E,x); }
  38. void copy_el(GenPtr& x)      const { LEDA_COPY(E,x); }
  39. void print_el(GenPtr& x,ostream& out) const { LEDA_PRINT(E,x,out);  }
  40. void read_el(GenPtr& x,istream& in)   const { E X; Read(X,in); x = Copy(X); }
  41. public:
  42. /*{Mcreation L }*/ 
  43. list() { cmp_ptr = 0; }
  44. /*{Mcreate creates  an instance var of type name and initializes it to 
  45.             the empty list.}*/
  46.  list(E a) : dlist(Copy(a)) { cmp_ptr = 0; }
  47.  list(const list<E>& a) : dlist(a) { cmp_ptr = 0; }
  48. virtual ~list() { clear(); }
  49. /*{Moperations 2 5 }*/
  50. /*{Mtext
  51. medskip
  52. {bf 3.1 Access Operations}
  53. medskip }*/
  54. int length() const {return dlist::length();}
  55. /*{Mop      returns the length of $L$.}*/
  56. int size() const {return dlist::size();}
  57. /*{Mop      returns $L$.length().}*/
  58. bool empty() const {return dlist::empty();}
  59. /*{Mop      returns true if $L$ is empty, false otherwise.}*/
  60. list_item first() const {return dlist::first();}
  61. /*{Mop      returns the first item of $L$.}*/
  62. list_item last() const {return dlist::last();}
  63. /*{Mop      returns the last item of $L$.}*/
  64. list_item item(int i) const {return dlist::get_item(i);}
  65. /*{Mop      returns the item at position $i$ (the first position is 0).
  66.              precond $i < L$.length().}*/
  67. list_item succ(list_item it) const {return dlist::succ(it);}
  68. /*{Mop      returns the successor item of item $it$, nil if
  69.      $it=L$.last().\
  70.      precond $it$ is an item in $L$.}*/
  71. list_item pred(list_item it) const {return dlist::pred(it);}
  72. /*{Mop      returns the predecessor item of item $it$, nil if
  73.      $it=L$.first().\
  74.      precond $it$ is an item in $L$.}*/
  75. list_item cyclic_succ(list_item it) const {return dlist::cyclic_succ(it);}
  76. /*{Mop      returns the cyclic successor of item $it$, i.e.,
  77.      $L$.first() if $it = L$.last(), $L$.succ($it$) otherwise.}*/
  78. list_item cyclic_pred(list_item it) const
  79. {return dlist::cyclic_pred(it);}
  80. /*{Mop      returns the cyclic predecessor of item $it$, i.e,
  81.              $L$.last() if $it = L$.first(), $L$.pred($it$) otherwise.}*/
  82. list_item search(E x) const   
  83. { ((GenPtr&)cmp_ptr) = 0; return dlist::search(Convert(x)); }
  84. /*{Mop      returns the first item of $L$ that contains $x$,
  85.      nil if $x$ is not an element of $L$.\
  86.      precond{compare has to be defined for type $E$.} }*/
  87. E  contents(list_item it) const { return LEDA_ACCESS(E,dlist::contents(it)); }
  88. /*{Mop      returns the contents $L[it]$ of item $it$.\
  89.      precond $it$ is an item in $L$.}*/
  90. E  inf(list_item it)      const { return contents(it); }
  91. /*{Mop      returns $L$.contents($it$).}*/
  92. E  head()                const { return LEDA_ACCESS(E,dlist::head()); }
  93. /*{Mop      returns the first element of $L$, i.e. the contents
  94.      of $L$.first().\
  95.      precond $L$ is not empty.}*/
  96. E  tail()                const { return LEDA_ACCESS(E,dlist::tail()); }
  97. /*{Mop      returns the last element of $L$, i.e. the contents
  98.      of $L$.last().\
  99.      precond $L$ is not empty.}*/
  100. int       rank(E x)   const   { return dlist::rank(Convert(x)); }
  101. /*{Mop      returns the rank of $x$ in $L$, i.e. its first
  102.      position in $L$ as an integer from [1dots $|L|$]
  103.      (0 if $x$ is not in $L$). }*/
  104. /*{Mtext
  105. medskip
  106. {bf 3.2 Update Operations}
  107. medskip }*/
  108. list_item push(E x)   { return dlist::push(Copy(x));}
  109. /*{Mop      adds a new item $<x>$ at the front of $L$ and 
  110.      returns it ( $L$.insert($x,L$.first$(),before$) ).}*/
  111. list_item append(E x) { return dlist::append(Copy(x));}
  112. /*{Mop      appends a new item $<x>$ to $L$ and returns
  113.              it ( $L$.insert($x,L$.last$(),after$) ).}*/
  114. list_item insert(E x, list_item l, int dir=0)
  115.                          { return dlist::insert(Copy(x),l,dir); }
  116. /*{Mopl     inserts a new item $<x>$ after (if $dir=after$)
  117.      or before (if $dir=before$) 
  118.      item $it$ into $L$ and
  119.      returns it
  120.      (here $after$ and $before$
  121.      are predefined $int$ constants).\ 
  122.      precond $it$ is an item in $L$.}*/
  123. GenPtr forall_loop_test(GenPtr it, E& x) const
  124. { if (it) x = contents(list_item(it));
  125.   return it;
  126.  }
  127. E  pop() { GenPtr x=dlist::pop(); 
  128.               E   y=LEDA_ACCESS(E,x); 
  129.               Clear(LEDA_ACCESS(E,x)); 
  130.               return y; }
  131. /*{Mop      deletes the first item from $L$ and returns its
  132.         contents.\
  133.      precond $L$ is not empty.}*/
  134. E  Pop() { GenPtr x=dlist::Pop(); 
  135.               E   y=LEDA_ACCESS(E,x); 
  136.               Clear(LEDA_ACCESS(E,x)); 
  137.               return y; }
  138. /*{Mop      deletes the last item from $L$ and returns its
  139.      contents.\
  140.      precond $L$ is not empty.}*/
  141. E  del_item(list_item it) { GenPtr x=dlist::del(it);
  142.                               E   y=LEDA_ACCESS(E,x);
  143.                               Clear(LEDA_ACCESS(E,x));
  144.                               return y; }
  145. /*{Mop      deletes the item $it$ from $L$ and returns its
  146.      contents $L[it]$.\
  147.      precond $it$ is an item in $L$.}*/
  148. E  del(list_item a)           { return del_item(a); }
  149. void  assign(list_item it, E x) { dlist::assign(it,Copy(x));}
  150. /*{Mop      makes $x$ the contents of item $it$.\
  151.      precond $it$ is an item in $L$.}*/
  152. void  conc(list<E>& L1)              { dlist::conc((dlist&)L1); }
  153. /*{Mop      appends list $L_1$ to list $L$ and makes $L_1$ the
  154.      empty list.\
  155.      precond: $L ne L_1$}*/
  156. void  split(list_item it, list<E>& L1, list<E>& L2)
  157.                                  { dlist::split(it,(dlist&)L1,(dlist&)L2);}
  158. /*{Mopl     splits $L$ at item $it$ into lists $L1$ and $L2$. More precisely,
  159.      if $it ne nil$ and $ L = x_1,dots,x_{k-1},it,x_{k+1},dots,x_n$
  160.              then $L1 = x_1,dots,x_{k-1}$ and $L2 = it,x_{k+1},dots,x_n$. If
  161.              $it = nil$ then $L1$ is made empty and $L2$ a copy of $L$. Finally
  162.              $L$ is made empty if it is not identical to $L1$ or $L2$.\
  163.      precond $it$ is an item of $L$ or $nil$.}*/
  164. void  split(list_item it, list<E>& L1, list<E>& L2, int dir)
  165.                                  { dlist::split(it,(dlist&)L1,(dlist&)L2,dir);}
  166. /*{Mopl     splits $L$ at item $it$ into lists $L1$ and $L2$. Item $it$ 
  167.              becomes the first item of $L2$ if $dir==0$ and the last item
  168.              of $L1$ otherwise.\ precond $it$ is an item of $L$.}*/
  169. void  sort(int (*cmp)(const E&, const E&)) { cmp_ptr = cmp; dlist::sort(); }
  170. /*{Mopl      sorts the items of $L$ using the ordering defined
  171.      by the compare function $cmp : Etimes E longrightarrow int$,
  172.      with\
  173.        $$cmp(a,b)  cases{< 0,  &if $a < b$cr
  174.                   = 0,  &if $a = b$cr
  175.                   > 0,  &if $a > b$cr}$$
  176.      More precisely, if $(in_1,dots,in_n)$ and 
  177.      $(out_1,dots,out_n)$ denote the values of $L$
  178.      before and after the call of sort, then
  179.      $cmp(L[out_j], L[out_{j+1}]) le 0$ for
  180.      $1le j<n$ and there is a
  181.      permutation
  182.      $pi$ of $[1..n]$ such that $out_i = in_{pi_i}$ for
  183.      $1 le i le n$
  184.      .}*/
  185. void  sort()                            { cmp_ptr = 0; dlist::sort(); }
  186. /*{Mop      sorts the items of $L$ using the default ordering of type $E$,
  187.              i.e., the linear order defined by function 
  188.              $int$ compare$(const E&, const E&)$. }*/
  189. list_item min()                 { cmp_ptr = 0; return dlist::min(); }
  190. /*{Mop      returns the item with the minimal contents with respect
  191.              to the default linear order of type $E$. }*/
  192. list_item min(int (*cmp)(const E&, const E&)) 
  193.                                 { cmp_ptr = cmp; return dlist::min(); }
  194. /*{Mopl      returns the item with the minimal contents with respect
  195.              to the linear order defined by compare function $cmp$. }*/
  196. list_item max()                 { cmp_ptr = 0; return dlist::max(); }
  197. /*{Mop      returns the item with the maximal contents with respect
  198.              to the default linear order of type $E$. }*/
  199. list_item max(int (*cmp)(const E&, const E&)) 
  200.                                 { cmp_ptr = cmp; return dlist::max(); }
  201. /*{Mopl      returns the item with the maximal contents with respect
  202.              to the linear order defined by compare function $cmp$. }*/
  203. void  apply(void (*f)(E& x))   { app_ptr = f; dlist::apply(); }
  204. /*{Mop      for all items $<x>$ in $L$ function $f$ is
  205.      called with argument $x$ (passed by reference).}*/
  206. void  bucket_sort(int i, int j, int (*f)(const E&))
  207.                                      { ord_ptr = f; dlist::bucket_sort(i,j); }
  208. /*{Mopl     sorts the items of $L$ using bucket sort,
  209.      where $f : E longrightarrow int$ with $f(x) in [i..j]$ for
  210.      all elements $x$ of $L$. The sort is stable,
  211.      i.e., if $f(x)=f(y)$ and $<x>$ is before $<y>$ in
  212.      $L$ then $<x>$ is before $<y>$ after the sort.}*/
  213. void permute() {dlist::permute();}
  214. /*{Mop      the items of $L$ are randomly permuted.}*/
  215. void clear() {dlist::clear();}
  216. /*{Mop      makes $L$ the empty list. }*/
  217. /*{Mtext
  218. bigskip
  219. {bf 3.3 Input and Output} }*/
  220. void read(istream& I, char delim = 'n') { dlist::read(I,delim); }
  221. /*{Mopl     reads a sequence of objects of type $E$ terminated
  222.      by the delimiter $delim$ from the input stream $I$
  223.      using the overloaded $Read$ function 
  224.      (section ref{Overloading}).
  225.      $L$ is made a list of appropriate length and the
  226.      sequence is stored in $L$.}*/
  227. void read(char delim = 'n') { dlist::read(delim); }
  228. /*{Mop      calls $L$.read($cin$, $delim$) to read $L$ from
  229.      the standard input stream $cin$.}*/
  230. void read(string s,char delim = 'n') {dlist::read(s,delim);}
  231. /*{Mopl     As above, but uses string $s$ as a prompt.}*/
  232. void print(ostream& O, char space = ' ') const { dlist::print(O,space); }
  233. /*{Mopl     prints the contents of list $L$ to the output
  234.      stream $O$ using the overload $Print$ function
  235.      (cf.~section ref{Overloading}) to print each element. The 
  236.      elements are separated by the character $space$.}*/
  237. void print(char space = ' ') const { dlist::print(space); }
  238. /*{Mop      calls $L$.print($cout$, $space$) to print $L$ on
  239.      the standard output stream $cout$.}*/
  240. void print(string s,char space = ' ') const { dlist::print(s,space); }
  241. /*{Mopl     As above, but uses string $s$ as a header.}*/
  242. /*{Mtext
  243. medskip
  244. {bf 3.4 Iterators }
  245. Each list $L$ has a special item called the iterator of $L$. There 
  246. are operations to read the current value or the contents of this iterator,
  247. to move it (setting it to its successor or predecessor) and to test whether 
  248. the end (head or tail) of the list is reached. If the iterator contains a 
  249. $list_item neq nil$ we call this item the position of the iterator. 
  250. Iterators are used to implement iteration statements on lists. }*/
  251. void set_iterator(list_item it) const {dlist::set_iterator(it);}
  252. /*{Mop      assigns item $it$ to the iterator.\
  253.      precond $it$ is in $L$ or $it$ = nil. }*/
  254. void init_iterator()  { dlist::init_iterator(); }
  255. /*{Mop      assigns nil to the iterator.}*/
  256. list_item get_iterator() { return dlist::get_iterator(); }
  257. /*{Mop      returns the current value of the iterator.}*/
  258. list_item move_iterator(int dir) const { return dlist::move_iterator(dir); }
  259. /*{Mopl     moves the iterator to its successor (predecessor)
  260.      if $dir=forward$ ($backward$) and to the first 
  261.      (last) item if the iterator is undefined (= nil), returns
  262.      the value of the iterator.}*/
  263. bool current_element(E& x) const {GenPtr y; bool b=dlist::current_element(y);
  264.                                      if (b) x = LEDA_ACCESS(E,y); return b; }
  265. /*{Mop      if the iterator is defined ($neq$ nil) its contents is
  266.              assigned to $x$ and true is returned else false
  267.      is returned.}*/
  268. bool next_element(E& x)   const  {GenPtr y; bool b = dlist::next_element(y);
  269.                                      if (b) x = LEDA_ACCESS(E,y); return b; }
  270. /*{Mop      calls $L$.move_iterator($forward$) and then  
  271.      returns $L$.current_element($x$). }*/
  272. bool prev_element(E& x)   const  {GenPtr y; bool b = dlist::prev_element(y);
  273.                                      if (b) x = LEDA_ACCESS(E,y); return b; }
  274. /*{Mop      calls $L$.move_iterator($backward$) and then 
  275.      returns $L$.current_element($x$). }*/
  276. /*{Mtext
  277. bigskip
  278. {bf 3.5 Operators} }*/
  279. list<E>& operator=(const list<E>& L1) 
  280. { dlist::operator=(L1); return *this;}
  281. /*
  282. list<E>& operator=(const list& L1) 
  283. */
  284. /*{Mbinop   The assignment operator makes $L$ a copy of
  285.      list $L_1$. More precisely if $L_1$ is the sequence
  286.      of items $x_1, x_2, dots , x_n$ then $L$ is made a
  287.      sequence of items $y_1, y_2, dots , y_n$ with
  288.      $L[y_i] = L_1[x_i]$ for $1 le i le n$.}*/
  289. #if !defined(__sgi)
  290. list<E>  operator+(const list<E>& a) 
  291. { dlist L = *(dlist*)this + *(dlist*)&a; return *(list<E>*)&L; }
  292. #endif
  293. list_item operator+=(E x)   { return append(x); }
  294. list_item operator[](int i) const   { return get_item(i); }
  295. E&  operator[](list_item it) { return LEDA_ACCESS(E,dlist::entry(it)); }
  296. /*{Marrop   returns a reference to the contents of $it$.}*/
  297. E   operator[](list_item p) const { return contents(p); }
  298. /*
  299. friend void Print(const list<E>& L, ostream& out) { L.print(out); }
  300. friend void Read(list<E>& L, istream& in)         { L.read(in); }
  301. */
  302. }; 
  303. //------------------------------------------------------------------------------
  304. // Iteration Macros
  305. //------------------------------------------------------------------------------
  306. #define forall_list_items(a,L) forall_items(a,L)
  307. #define Forall_list_items(a,L) for( a=(L).last();  a ; a=(L).pred(a) )
  308. /*{Mtext
  309. bigskip
  310. {bf 3.6 Iterations Macros}
  311. {bf forall_items}($it,L$)       
  312. ${$ ``the items of $L$ are successively assigned to $it$'' $}$
  313. {bf forall}($x,L$)       
  314. ${$ ``the elements of $L$ are successively assigned to $x$'' $}$ }*/
  315. /*{Mimplementation
  316. The data type list is realized by doubly linked linear lists. All operations
  317. take constant time except for the following operations: search and rank take 
  318. linear time $O(n)$, item($i$) takes time $O(i)$, bucket_sort takes time 
  319. $O(n + j - i)$ and sort takes time $O(ncdot ccdotlog n$) where $c$ is the 
  320. time complexity of the compare function. $n$ is always the current length of 
  321. the list.}*/
  322. #endif