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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  slist.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_IMPL_SLIST_H
  12. #define LEDA_IMPL_SLIST_H
  13. //------------------------------------------------------------------------------
  14. // simply linked lists
  15. //------------------------------------------------------------------------------
  16. #include <LEDA/basic.h>
  17. class SLIST; 
  18. class slink;
  19. typedef slink* slist_item;
  20. //------------------------------------------------------------------------------
  21. // class slink 
  22. //------------------------------------------------------------------------------
  23. class slink {
  24.   friend class SLIST;
  25.   slink* succ;
  26.   GenPtr e;
  27.   slink(GenPtr a, slink* suc) { e = a; succ = suc; }
  28.   LEDA_MEMORY(slink)
  29. };
  30. //------------------------------------------------------------------------------
  31. // SLIST: base class for all simply linked Lists
  32. //------------------------------------------------------------------------------
  33. class SLIST {
  34.    slink* h;                     //head
  35.    slink* t;                     //tail
  36.    slink* iterator;              //iterator;
  37.    int    count;                 //length of List
  38. virtual void clear_el(GenPtr&) const {}
  39. virtual void copy_el(GenPtr&)  const {}
  40. virtual int  int_type() const { return 0; }
  41. public:
  42.    int space()  const { return sizeof(SLIST) + count * sizeof(slink); }
  43.    int length() const { return count; }
  44.    bool empty()  const { return (count==0);}
  45.    slink* insert(GenPtr, slink*);
  46.    slink* push(GenPtr a)   
  47.    { count++;
  48.      h = new slink(a,h); 
  49.      if (t==0) t = h;
  50.      return h;
  51.    }
  52.    slink* append(GenPtr a)
  53.    { count++;
  54.      if (t) t = t->succ = new slink(a,0); 
  55.      else   t = h = new slink(a,0); 
  56.      return t;
  57.    } 
  58.    slink* first()               const { return h; }
  59.    slink* first_item()          const { return h; }
  60.    slink* last()                const { return t; }
  61.    slink* last_item()           const { return t; }
  62.    slink* next_item(slink* p)   const { return p->succ; }
  63.    slink* succ(slink* l)        const { return l->succ; }
  64.    slink* cyclic_succ(slink*)   const;
  65. // iteration
  66.    GenPtr loop_to_succ(GenPtr& x) const { return x = slist_item(x)->succ; }
  67. #if defined(__ELSE_SCOPE_BUG__)
  68.    GenPtr forall_loop_item;
  69.    GenPtr& Forall_Loop_Item() const { return (GenPtr&)forall_loop_item; }
  70. #endif
  71. // old iteration stuff
  72.    void   set_iterator(slink* p)   const { *(slink**)&iterator = p; }
  73.    slink* get_iterator()  const { return iterator; }
  74.    void   init_iterator() const { set_iterator(0); }
  75.    slink* move_iterator() const  
  76.    { set_iterator( iterator ? iterator->succ : h);
  77.      return iterator;
  78.    } 
  79.    void conc(SLIST&);
  80.    GenPtr head()   const { return h ? h->e : 0;}
  81.    GenPtr tail()   const { return t ? t->e : 0;}
  82.    GenPtr pop();
  83.    void del_succ(slink* p)    
  84.    { slink* q = p->succ;
  85.      if (q == t) t = p;
  86.      p->succ = q->succ; 
  87.      delete q;
  88.      count--;
  89.    }
  90.    bool current_element(GenPtr& x)  const
  91.    { if (!iterator) return false;
  92.      else { x = iterator->e;
  93.             return true; }
  94.     }
  95.    bool next_element(GenPtr& x) const 
  96.   { move_iterator(); 
  97.     return current_element(x); 
  98.    }
  99.    GenPtr  contents(slink* l)  const  { return l->e; }
  100.    GenPtr& entry(slink* l)            { return l->e; }
  101.    GenPtr& operator[](slink* l)       { return l->e; }
  102.    GenPtr  operator[](slink* l) const { return l->e; }
  103.    void clear();
  104.    SLIST();    
  105.    SLIST(GenPtr a);
  106.    SLIST& operator=(const SLIST&); 
  107.    SLIST(const SLIST&);
  108.    virtual ~SLIST()     { clear(); }
  109. };
  110. #if !defined(__TEMPLATE_FUNCTIONS__)
  111. // dummy I/O and cmp functions
  112. inline void Print(const SLIST&,ostream&) { }
  113. inline void Read(SLIST&, istream&) { }
  114. inline int  compare(const SLIST&,const SLIST&) { return 0; }
  115. #endif
  116. #endif