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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  dlist.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_DLIST_H
  12. #define LEDA_DLIST_H
  13. //------------------------------------------------------------------------------
  14. //  doubly linked lists
  15. //------------------------------------------------------------------------------
  16. #include <LEDA/basic.h>
  17. //------------------------------------------------------------------------------
  18. // some declarations
  19. //------------------------------------------------------------------------------
  20. class dlist; 
  21. class dlink;
  22. typedef dlink* list_item;
  23. //------------------------------------------------------------------------------
  24. // class dlink (list items)
  25. //------------------------------------------------------------------------------
  26. class dlink {
  27.   dlink* succ;
  28.   dlink* pred;
  29.   GenPtr e;
  30.   dlink(GenPtr a, dlink* pre, dlink* suc)
  31.   { 
  32.     e = a;
  33.     succ = suc;
  34.     pred = pre;
  35.   }
  36.   LEDA_MEMORY(dlink)
  37.   friend class dlist;
  38.   friend dlink* succ_item(dlink* p) { return p->succ; }
  39.   friend dlink* pred_item(dlink* p) { return p->pred; }
  40.   //space: 3 words = 12 bytes
  41. };
  42. //------------------------------------------------------------------------------
  43. // dlist: base class for all doubly linked lists
  44. //------------------------------------------------------------------------------
  45. class dlist {
  46.    dlink* h;                     //head
  47.    dlink* t;                     //tail
  48.    dlink* iterator;              //iterator
  49.    int count;                    //length of list
  50. //space: 4 words + virtual =  5 words = 20 bytes
  51. virtual int  cmp(GenPtr, GenPtr) const { return 0; }
  52. virtual int  ord(GenPtr) const { return 0; }
  53. virtual void app(GenPtr&) const {}
  54. virtual void read_el(GenPtr&,istream&) const {}
  55. virtual void print_el(GenPtr&,ostream&) const {}
  56. virtual void clear_el(GenPtr&) const {}
  57. virtual void copy_el(GenPtr&)  const {}
  58. virtual int  int_type() const { return 0; }
  59. void quick_sort(list_item*,list_item*);
  60. void int_quick_sort(list_item*,list_item*);
  61. void insertion_sort(dlink**,dlink**,dlink**);
  62. void int_insertion_sort(dlink**,dlink**,dlink**);
  63. void recompute_length() const;
  64. public:
  65. // access operations
  66.    int  length() const { if (count < 0) recompute_length(); return count; }
  67.    int  size()   const { return length(); }
  68.    bool empty()  const { return h==nil; }
  69.    dlink* first()               const { return h; }
  70.    dlink* first_item()          const { return h; }
  71.    dlink* last()                const { return t; }
  72.    dlink* last_item()           const { return t; }
  73.    dlink* next_item(dlink* p)   const { return p->succ; }
  74.    dlink* succ(dlink* l)        const { return l->succ; }
  75.    dlink* pred(dlink* l)        const { return l->pred; }
  76.    dlink* cyclic_succ(dlink*)   const;
  77.    dlink* cyclic_pred(dlink*)   const;
  78.    dlink* succ(dlink* l, int i) const; 
  79.    dlink* pred(dlink* l, int i) const;
  80.    dlink* get_item(int = 0)     const; 
  81.    dlink* max() const;
  82.    dlink* min() const;
  83.    dlink* search(GenPtr) const;
  84.    int    rank(GenPtr) const;
  85.    GenPtr contents(dlink* l) const { return l->e; }
  86.    GenPtr head()             const { return h ? h->e : 0;}
  87.    GenPtr tail()             const { return t ? t->e : 0;}
  88. // update operations
  89. protected:
  90.    dlink* insert(GenPtr a, dlink* l, int dir=0);
  91.    dlink* push(GenPtr a)   
  92.    { if (count >= 0) count++;
  93.      if (h) h = h->pred = new dlink(a,0,h); 
  94.      else   h = t =  new dlink(a,0,0);
  95.      return h;
  96.     }
  97.    
  98.    dlink* append(GenPtr a)
  99.    { if (count >= 0) count++;
  100.      if (t) t = t->succ = new dlink(a,t,0);
  101.      else   t = h = new dlink(a,0,0);
  102.      return t; 
  103.     } 
  104.    
  105.    void   assign(dlink* l, GenPtr a) { clear_el(l->e); l->e = a; }
  106.    void   apply();
  107.    void   sort();
  108. public:
  109.    GenPtr del(dlink* loc);
  110.    GenPtr pop();
  111.    GenPtr Pop();
  112.    void   conc(dlist&,int dir=0);
  113.    void   split(list_item,dlist&,dlist&,int dir=0);
  114.    void   bucket_sort(int,int);
  115.    void   permute();
  116.    void   clear();
  117. // iteration
  118.    GenPtr loop_to_succ(GenPtr& x) const { return x = list_item(x)->succ; }
  119.    GenPtr loop_to_pred(GenPtr& x) const { return x = list_item(x)->pred; }
  120. #if defined(__ELSE_SCOPE_BUG__)
  121.    GenPtr forall_loop_item;
  122.    GenPtr& Forall_Loop_Item() const { return (GenPtr&)forall_loop_item; }
  123. #endif
  124. //  old iteration stuff
  125.    void set_iterator(dlink* p) const { *(dlink**)&iterator = p; }
  126.    void init_iterator()        const { set_iterator(nil); }
  127.    void reset()                const { set_iterator(nil); }
  128.  
  129.    dlink* get_iterator()       const { return iterator; }
  130.    dlink* move_iterator(int=0) const;
  131.    bool   current_element(GenPtr&) const;
  132.    bool   next_element(GenPtr&)    const;
  133.    bool   prev_element(GenPtr&)    const;
  134. // operators
  135.    GenPtr&   entry(dlink* l)            { return l->e; }
  136.    GenPtr    inf(dlink* l)        const { return l->e; }
  137.    GenPtr&   operator[](dlink* l)       { return l->e; }
  138.    GenPtr    operator[](dlink* l) const { return l->e; }
  139.    dlist& operator=(const dlist&); 
  140.    dlist  operator+(const dlist&); 
  141.    void print(ostream&,string, char)       const;    
  142.    void print(ostream& out,char space=' ') const { print(out,"",space);  }
  143.    void print(string s, char space=' ')    const { print(cout,s,space);  }
  144.    void print(char space=' ')              const { print(cout,"",space); }   
  145.    void read(istream&,string, int);  
  146.    void read(istream& in,int delim) { read(in,"",delim); }
  147.    void read(istream& in)           { read(in,"",EOF); }
  148.    void read(string s, int delim)   { read(cin,s,delim); }   
  149.    void read(string s)              { read(cin,s,'n'); }   
  150.    void read(char delim)  { read(cin,"",delim);}  
  151.    void read()            { read(cin,"",'n');}  
  152. // constructors & destructors
  153.    dlist();    
  154.    dlist(GenPtr a);
  155.    dlist(const dlist&);
  156.    virtual ~dlist()  { clear(); }
  157.    int space()  const { return sizeof(dlist) + length() * sizeof(dlink); }
  158. };
  159. #if !defined(__TEMPLATE_FUNCTIONS__)
  160. // default I/O and cmp functions
  161. inline void Print(const dlist& L,ostream& out) { L.print(out); out << endl; }
  162. inline void Read(dlist& L, istream& in)        { L.read(in,'n'); }
  163. inline int  compare(const dlist&,const dlist&) { return 0; }
  164. #endif
  165. #endif