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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _slist.c
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #include <LEDA/impl/slist.h>
  12. //------------------------------------------------------------------------------
  13. // Members of class SLIST
  14. //------------------------------------------------------------------------------
  15. SLIST::SLIST()      
  16. { h=0; 
  17.   t=0;
  18.   count=0;
  19.   iterator=0; 
  20. }
  21. SLIST::SLIST(GenPtr a) 
  22. { h=t=new slink(a,0);
  23.   count=1; 
  24.   iterator=0;  
  25. }
  26. SLIST::SLIST(const SLIST& x)
  27. { register slink* p;
  28.   iterator=h=t=0; 
  29.   count = 0; 
  30.                               
  31.   for (p = x.h; p; p = p->succ) append(p->e); 
  32.   if (!int_type())
  33.     for (p = h; p; p = p->succ) x.copy_el(p->e);
  34. }
  35. GenPtr SLIST::pop()    
  36. { if (iterator!=0) error_handler(1,"pop: deletion while iterator is active");
  37.   GenPtr res;
  38.   if (h) 
  39.   { if (t==h) t = 0;
  40.     slink* x=h; 
  41.     res = x->e;
  42.     h=x->succ; 
  43.     delete x;
  44.     count--;
  45.    }
  46.   return res;
  47. }
  48. /*
  49. void SLIST::del_succ(slink* p)    
  50. { slink* q = p->succ;
  51.   if (q) 
  52.   { if (t==q) t = p;
  53.     p->succ = q->succ; 
  54.     delete q;
  55.     count--;
  56.    }
  57. }
  58. */
  59. slink* SLIST::insert(GenPtr a, slink* p)   
  60. { if (iterator!=0) 
  61.          error_handler(2,"insert: insertion while iterator is active");
  62.   count++;
  63.   p->succ = new slink(a,p->succ); 
  64.   if (t==p) t = p->succ;
  65.   return h;
  66. }
  67. void SLIST::conc(SLIST& l)
  68. { if (iterator!=0) error_handler(2,"conc: iterator is active");
  69.  if (count > 0) 
  70.    { t->succ = l.h;
  71.      if (l.count > 0) t = l.t; 
  72.     }
  73.  else 
  74.    { h = l.h; 
  75.      t = l.t; 
  76.     }
  77.  count = count+l.count;
  78.  l.h = l.t = 0;
  79.  l.count = 0;
  80. }
  81. slink* SLIST::cyclic_succ(slink* loc) const
  82. { if (loc==0) return 0;
  83.   return loc->succ? loc->succ : h;
  84.  }
  85. SLIST& SLIST::operator=(const SLIST& x)
  86. { register slink* p;
  87.   clear();
  88.   for (p = x.h; p; p = p->succ) append(p->e); 
  89.   if (!int_type())
  90.     for (p = h; p; p = p->succ) copy_el(p->e);
  91.   return *this;
  92.  }
  93. void SLIST::clear()
  94. { if (h==0) return;
  95.   register slink* p;
  96.   if(!int_type())
  97.     for(p = h; p; p = p->succ) clear_el(p->e);
  98.   deallocate_list(h,t,sizeof(slink));
  99.   iterator=h=t=0;
  100.   count=0;
  101.  }