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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _m_heap.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/m_heap.h>
  12. m_heap::m_heap(int m)
  13. { if (m<=0) error_handler(1,string("m_heap constructor: illegal size = %d",m));
  14.   count = 0;
  15.   start = 0;
  16.   offset = 0;
  17.   M = m+1;
  18.   T = new list_item[M+1];
  19.   for(int i=0; i<=M; i++) T[i] = L.append(Convert(MAXINT));
  20. }
  21. void m_heap::clear()
  22. { L.clear();
  23.   for(int i=0; i<=M; i++) T[i] = L.append(Convert(MAXINT));
  24.   count = 0;
  25.   start = 0;
  26.   offset = 0;
  27. m_heap_item m_heap::first_item() const
  28. { list_item it = L.first();
  29.   while (it && L.inf(it) == Convert(MAXINT)) it = L.succ(it);
  30.   return it;
  31.  }
  32.   
  33. m_heap_item m_heap::next_item(m_heap_item it) const
  34. { it = L.succ(it);
  35.   while (it && L.inf(it) == Convert(MAXINT)) it = L.succ(it);
  36.   return it;
  37.  }
  38. m_heap_item m_heap::insert(GenPtr kk, GenPtr info)   // int key
  39. { int key = LEDA_ACCESS(int,kk);
  40.   int k;
  41.   if (count)
  42.    { find_min();
  43.      k = key-offset; 
  44.     }
  45.   else 
  46.    { start = key%M;
  47.      k = 0;
  48.      offset = key;
  49.     }
  50.   if (k<0 || k>=M) 
  51.    error_handler(1,string("m_heap insert: illegal key %d n",key));
  52.   copy_inf(info);
  53.   count++;
  54.   return L.insert(info,T[(start+k)%M]); 
  55. }
  56. m_heap_item m_heap::find_min() const
  57. { if (count)
  58.   { while (L.succ(T[start])==T[start+1])
  59.     { (*(int*)&offset)++;
  60.       (*(int*)&start)++;
  61.       if (start == M) (*(int*)&start) = 0;
  62.      }
  63.     return L.succ(T[start]);
  64.    }
  65.  else return 0;
  66. }
  67. GenPtr m_heap::del_min()
  68. { if (count)
  69.    { find_min();
  70.      count--;
  71.      m_heap_item p = L.succ(T[start]);
  72.      GenPtr inf = L.contents(p);
  73.      L.del(p);
  74.      return inf;
  75.     }
  76.   else error_handler(1,"m_heap del_min: heap is empty");
  77.   return 0;
  78. }
  79. void m_heap::del_item(m_heap_item it) 
  80. { GenPtr x = L.contents(it);
  81.   clear_inf(x);
  82.   L.del(it); 
  83.   count--;
  84. }
  85. void m_heap::change_key(m_heap_item it, GenPtr kk)  // int key
  86. { int key = LEDA_ACCESS(int,kk);
  87.   find_min();
  88.   GenPtr inf = L.contents(it);
  89.   L.del(it); 
  90.   int k = key - offset;
  91.   if (k<0 || k>=M) 
  92.    error_handler(1,string("m_heap change key: illegal key %dn",key));
  93.   L.insert(inf,T[(start+k)%M]);
  94. }
  95. void m_heap::print() const
  96. { m_heap_item p;
  97.   cout << string("count = %d   start = %d   offset = %dn",count,start,offset);
  98.   for (int i=0;i<M;i++) 
  99.   if (L.contents(L.succ(T[i])) != Convert(MAXINT))
  100.   { cout << string("%3d: ",i);
  101.     p = L.succ(T[i]);
  102.     while (L.contents(p) != Convert(MAXINT))
  103.      { cout << string("(%d) ",L.contents(p));
  104.        p = L.succ(p);
  105.       }
  106.    cout << "n";
  107.    }
  108.    cout << "n";
  109. }