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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  olist.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_OLIST_H
  12. #define LEDA_OLIST_H
  13. #include <LEDA/basic.h>
  14. //------------------------------------------------------------------------------
  15. //
  16. //  obj_list  (doubly linked lists of obj_links)
  17. //
  18. //  each "obj_link" may be present in at most one list 
  19. //  
  20. //------------------------------------------------------------------------------
  21. class obj_list; 
  22. class obj_link;
  23. typedef int  (*CMP_ITEM)(obj_link*,obj_link*);
  24. typedef void (*APP_ITEM)(obj_link*);
  25. typedef int  (*ORD_ITEM)(obj_link*);
  26. //------------------------------------------------------------------------------
  27. // class obj_link (base class for all list items)
  28. //------------------------------------------------------------------------------
  29. class obj_link {
  30. protected:
  31.   obj_link* succ_link;
  32.   obj_link* pred_link;
  33. void del_item() 
  34. { pred_link->succ_link = succ_link; 
  35.   succ_link->pred_link = pred_link; 
  36.  }
  37. public:
  38. //  obj_link() { succ = nil; }
  39.   obj_link* succ_item() { return succ_link; }
  40.   obj_link* pred_item() { return pred_link; }
  41.   friend class obj_list;
  42.   friend class c_obj_list;
  43.   friend class sc_obj_list;
  44.   friend class graph;
  45.   friend class node_list;
  46.   friend class node_slist;
  47. };
  48. //------------------------------------------------------------------------------
  49. // obj_list: base class for all doubly linked lists
  50. //------------------------------------------------------------------------------
  51. class obj_list {
  52.    obj_link* h;           // head
  53.    obj_link* t;           // tail
  54.    int count;             // length of list
  55. void quick_sort(obj_link**,obj_link**,CMP_ITEM);
  56. void insertion_sort(obj_link**,obj_link**,obj_link**,CMP_ITEM);
  57. public:
  58. // access operations
  59.    int  length() const { return count; }
  60.    int  size()   const { return count; }
  61.    bool empty()  const { return (count==0) ? true : false;}
  62.    obj_link* first()               const { return h; }
  63.    obj_link* first_item()          const { return h; }
  64.    obj_link* last()                const { return t; }
  65.    obj_link* last_item()           const { return t; }
  66.    obj_link* next_item(obj_link* p)   const { return p->succ_link; }
  67.    obj_link* succ(obj_link* p)        const { return p->succ_link; }
  68.    obj_link* pred(obj_link* p)        const { return p->pred_link; }
  69.    obj_link* cyclic_succ(obj_link* p) const 
  70.    { return p->succ_link? p->succ_link : h; }
  71.    obj_link* cyclic_pred(obj_link* p) const 
  72.    { return p->pred_link? p->pred_link : t; }
  73.    obj_link* succ(obj_link* l, int i) const; 
  74.    obj_link* pred(obj_link* l, int i) const;
  75.    obj_link* get_item(int = 0)     const; 
  76.    obj_link* max(CMP_ITEM) const;
  77.    obj_link* min(CMP_ITEM) const;
  78.    obj_link* search(obj_link*) const;
  79.    int    rank(obj_link*) const;
  80. // update operations
  81.    obj_link* insert(obj_link* p, obj_link* l);
  82.    obj_link* insert(obj_link* p, obj_link* l, int dir);
  83.    obj_link* push(obj_link* p);
  84.    obj_link* append(obj_link* p);
  85.    void del(obj_link* loc);
  86.    obj_link* pop();
  87.    obj_link* Pop();
  88.    void   conc(obj_list&);
  89.    void   split(obj_link*,obj_list&,obj_list&);
  90.    void   apply(APP_ITEM);
  91.    void   sort(CMP_ITEM);
  92.    void   bucket_sort(int,int,ORD_ITEM);
  93.    void   permute();
  94.    void   clear();
  95.    obj_list& operator=(const obj_list&); 
  96.    obj_list  operator+(const obj_list&); 
  97. // constructors & destructors
  98.    obj_list();    
  99.  //obj_list(const obj_list&);
  100.   ~obj_list()  { clear(); }
  101. };
  102. inline obj_link* obj_list::push(obj_link* p)   
  103. { count++;
  104.   p->pred_link = 0;
  105.   p->succ_link = h;
  106.   if (h) 
  107.       h = h->pred_link = p;
  108.   else   
  109.       h = t =  p;
  110.   return p;
  111.  }
  112. inline obj_link* obj_list::append(obj_link* p)
  113. { count++;
  114.   p->pred_link = t;
  115.   p->succ_link = 0;
  116.   if (t) 
  117.       t = t->succ_link = p;
  118.   else  
  119.       t = h = p;
  120.   return p; 
  121.  } 
  122. inline obj_link* obj_list::pop()    
  123. { obj_link* p=h; 
  124.   if (p) 
  125.   { if (--count) 
  126.       { h = h->succ_link; 
  127.         h->pred_link = 0; 
  128.        }
  129.     else  
  130.       h = t = 0;
  131.    }
  132.   return p;
  133.  }
  134. inline obj_link* obj_list::Pop()    
  135. { obj_link* p=t; 
  136.   if (p)
  137.   { if (--count) 
  138.       { t = t->pred_link; 
  139.         t->succ_link = 0; 
  140.        }
  141.     else  
  142.       h = t = 0;
  143.    }
  144.   return p;
  145.  }
  146. inline obj_link* obj_list::insert(obj_link* n, obj_link* p) 
  147. { // insert n insert after p
  148.   obj_link* s=p->succ_link;
  149.   n->pred_link = p;
  150.   n->succ_link = s;
  151.   p->succ_link = n;
  152.   if (p==t) t=n; else s->pred_link = n;
  153.   count++;
  154.   return n;
  155. }
  156. //------------------------------------------------------------------------------
  157. //
  158. // c_obj_list (doubly linked circular object list)
  159. //
  160. // simple and efficient implementation (no counter, iterator, sorting, etc.)
  161. // removed items are assigned a nil succ pointer 
  162. // member(x) <==>  x->succ != nil
  163. //
  164. //------------------------------------------------------------------------------
  165. class c_obj_list : public obj_link {
  166. // the list head is an obj_link, namely the predecessor of the first 
  167. // and the successor of the last element
  168. public:
  169. bool empty()  const { return (succ_link==(obj_link*)this) ? true : false;}
  170. obj_link* first()      const { return (succ_link==(obj_link*)this) ? nil : succ_link; }
  171. obj_link* last()       const { return (pred_link==(obj_link*)this) ? nil : pred_link; }
  172. obj_link* first_item() const { return first(); }
  173. obj_link* last_item()  const { return last(); }
  174. obj_link* next_item(obj_link* p) const { return succ(p); }
  175. obj_link* succ(obj_link* p) const 
  176. { return (p->succ_link==(obj_link*)this)? nil : p->succ_link;}
  177. obj_link* pred(obj_link* p) const 
  178. { return (p->pred_link==(obj_link*)this)? nil : p->pred_link;}
  179. obj_link* cyclic_succ(obj_link* p) const 
  180. { return (p->succ_link==(obj_link*)this) ? pred_link : p->succ_link; }
  181. obj_link* cyclic_pred(obj_link* p) const 
  182. { return (p->pred_link==(obj_link*)this) ? succ_link : p->pred_link; }
  183.  void insert(obj_link* n, obj_link* p) 
  184.  { // insert n insert after p
  185.    obj_link* s=p->succ_link;
  186.    n->pred_link = p;
  187.    n->succ_link = s;
  188.    p->succ_link = n;
  189.    s->pred_link = n;
  190.   }
  191.  obj_link* del(obj_link* x)
  192.  { obj_link*  p = x->pred_link;
  193.    obj_link*  s = x->succ_link;
  194.    p->succ_link = s;
  195.    s->pred_link = p;
  196.    x->succ_link = nil;
  197.    return x;
  198.   }
  199.  bool member(obj_link* x) { return x->succ_link != nil; }
  200.  void push(obj_link* p)   { insert(p,this); }
  201.  void append(obj_link* p) { insert(p,pred_link); }
  202.  obj_link* pop() { return del(succ_link); }
  203.  obj_link* Pop() { return del(pred_link); }
  204.  void clear() 
  205.  { while(succ_link != this) 
  206.    { obj_link* p = succ_link;
  207.      succ_link = p->succ_link;
  208.      p->succ_link = nil;
  209.     }
  210.    pred_link = this; 
  211.   }
  212.  void init() { succ_link = pred_link = this; }
  213. // constructors & destructors
  214.  c_obj_list()  { succ_link = pred_link = this; }
  215. ~c_obj_list()  { clear(); }
  216. };
  217. #endif