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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _b_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/b_heap.h>
  12. b_heap::b_heap(int a, int b) : T(a,b)
  13. { if (b<a) error_handler(1,"constructor: illegal sizen");
  14.   low = a;
  15.   high = b;
  16.   min = high+1;
  17.   max = low-1;
  18.   int i;
  19.   for(i=a;i<=b;i++) T[i] = new list<b_heap_item>;
  20. }
  21. void b_heap::clear()
  22. { int i;
  23.   for (i=low;i<=high;i++) T[i]->clear();
  24.   min = high+1;
  25.   max = low-1;
  26. b_heap_item b_heap::insert(int key, GenPtr info) 
  27. { if (key<low || key>high) 
  28.   error_handler(1,string("insert: illegal key %dn",key));
  29.   if (key<min) min = key;
  30.   if (key>max) max = key;
  31.   b_heap_item it = new  b_heap_node(key,info);
  32.   it->loc = T[key]->append(it); 
  33.   return it;
  34. }
  35. b_heap_item b_heap::find_min()
  36. { if (min>high) return 0;
  37.   return T[min]->head();
  38. }
  39. b_heap_item b_heap::find_max()
  40. { if (max<low) return 0;
  41.   return T[max]->head();
  42. }
  43. GenPtr b_heap::del_min()
  44. { if (min>high) 
  45.        error_handler(1,"b_heap del_min: heap is empty");
  46.   b_heap_item p = T[min]->pop();
  47.   GenPtr res = p->info;
  48.   delete p;
  49.   while ((min <= high) && (T[min]->empty())) min++;
  50.   if (min>high) max = low-1;
  51.   return res;
  52. }
  53. GenPtr b_heap::del_max()
  54. { if (max<0) error_handler(1,"b_heap del_max: heap is empty");
  55.   b_heap_item p = T[max]->pop();
  56.   GenPtr res = p->info;
  57.   delete p;
  58.   while ((max>=low) && (T[max]->empty())) max--;
  59.   if (max<low) min = high+1;
  60.   return res;
  61. }
  62. b_heap_item b_heap::decrease_key(b_heap_item it, int k)
  63. { if (it==0) error_handler(1,"decrease_key: item = niln");
  64.   if (k<low || k>high) error_handler(1,"decrease_key: illegal keyn");
  65.   if (it->loc==0) error_handler(1,"decrease_key: item not foundn");
  66.   T[it->key]->del(it->loc);
  67.   while ((max >= low) && (T[max]->empty())) max--;
  68.   it->key = k;
  69.   it->loc = T[k]->append(it); 
  70.   if (k<min) min = k;
  71.   return it;
  72. }
  73. b_heap_item b_heap::increase_key(b_heap_item it, int k)
  74. { if (it==0) error_handler(1,"increase_key: item = niln");
  75.   if (k<low || k>high) error_handler(1,"increase_key:illegal keyn");
  76.   if (it->loc==0) error_handler(1,"increase_key: item not foundn");
  77.   T[it->key]->del(it->loc);
  78.   while ((min <= high) && (T[min]->empty())) min++;
  79.   it->key = k;
  80.   it->loc = T[k]->append(it); 
  81.   if (k>max) max = k;
  82.   return it;
  83. }
  84. void b_heap::delete_item(b_heap_item it) 
  85. { if (it==0) error_handler(1,"delete_item: item = niln");
  86.   if (it->loc==0) error_handler(1,"delete_item: item not foundn");
  87.   T[it->key]->del(it->loc); 
  88.   while ((min <= high) && (T[min]->empty())) min++;
  89.   while ((max >= low) && (T[max]->empty())) max--;
  90.   delete it;
  91. }
  92. void b_heap::print()
  93. { for (int i=low;i<=high;i++) 
  94.   { cout << i << ": ";
  95.     T[i]->print();
  96.     cout << "n";
  97.    }
  98.  }