priorityq-heap.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /*
  2. * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
  3. * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
  4. *
  5. * Permission is hereby granted, free of charge, to any person obtaining a
  6. * copy of this software and associated documentation files (the "Software"),
  7. * to deal in the Software without restriction, including without limitation
  8. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  9. * and/or sell copies of the Software, and to permit persons to whom the
  10. * Software is furnished to do so, subject to the following conditions:
  11. *
  12. * The above copyright notice including the dates of first publication and
  13. * either this permission notice or a reference to
  14. * http://oss.sgi.com/projects/FreeB/
  15. * shall be included in all copies or substantial portions of the Software.
  16. *
  17. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  18. * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  20. * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  21. * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
  22. * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  23. * SOFTWARE.
  24. *
  25. * Except as contained in this notice, the name of Silicon Graphics, Inc.
  26. * shall not be used in advertising or otherwise to promote the sale, use or
  27. * other dealings in this Software without prior written authorization from
  28. * Silicon Graphics, Inc.
  29. */
  30. /*
  31. ** Author: Eric Veach, July 1994.
  32. **
  33. */
  34. #ifndef __priorityq_heap_h_
  35. #define __priorityq_heap_h_
  36. /* Use #define's so that another heap implementation can use this one */
  37. #define PQkey PQHeapKey
  38. #define PQhandle PQHeapHandle
  39. #define PriorityQ PriorityQHeap
  40. #define pqNewPriorityQ(leq) __gl_pqHeapNewPriorityQ(leq)
  41. #define pqDeletePriorityQ(pq) __gl_pqHeapDeletePriorityQ(pq)
  42. /* The basic operations are insertion of a new key (pqInsert),
  43. * and examination/extraction of a key whose value is minimum
  44. * (pqMinimum/pqExtractMin). Deletion is also allowed (pqDelete);
  45. * for this purpose pqInsert returns a "handle" which is supplied
  46. * as the argument.
  47. *
  48. * An initial heap may be created efficiently by calling pqInsert
  49. * repeatedly, then calling pqInit. In any case pqInit must be called
  50. * before any operations other than pqInsert are used.
  51. *
  52. * If the heap is empty, pqMinimum/pqExtractMin will return a NULL key.
  53. * This may also be tested with pqIsEmpty.
  54. */
  55. #define pqInit(pq) __gl_pqHeapInit(pq)
  56. #define pqInsert(pq,key) __gl_pqHeapInsert(pq,key)
  57. #define pqMinimum(pq) __gl_pqHeapMinimum(pq)
  58. #define pqExtractMin(pq) __gl_pqHeapExtractMin(pq)
  59. #define pqDelete(pq,handle) __gl_pqHeapDelete(pq,handle)
  60. #define pqIsEmpty(pq) __gl_pqHeapIsEmpty(pq)
  61. /* Since we support deletion the data structure is a little more
  62. * complicated than an ordinary heap. "nodes" is the heap itself;
  63. * active nodes are stored in the range 1..pq->size. When the
  64. * heap exceeds its allocated size (pq->max), its size doubles.
  65. * The children of node i are nodes 2i and 2i+1.
  66. *
  67. * Each node stores an index into an array "handles". Each handle
  68. * stores a key, plus a pointer back to the node which currently
  69. * represents that key (ie. nodes[handles[i].node].handle == i).
  70. */
  71. typedef void *PQkey;
  72. typedef long PQhandle;
  73. typedef struct PriorityQ PriorityQ;
  74. typedef struct { PQhandle handle; } PQnode;
  75. typedef struct { PQkey key; PQhandle node; } PQhandleElem;
  76. struct PriorityQ {
  77. PQnode *nodes;
  78. PQhandleElem *handles;
  79. long size, max;
  80. PQhandle freeList;
  81. int initialized;
  82. int (*leq)(PQkey key1, PQkey key2);
  83. };
  84. PriorityQ *pqNewPriorityQ( int (*leq)(PQkey key1, PQkey key2) );
  85. void pqDeletePriorityQ( PriorityQ *pq );
  86. void pqInit( PriorityQ *pq );
  87. PQhandle pqInsert( PriorityQ *pq, PQkey key );
  88. PQkey pqExtractMin( PriorityQ *pq );
  89. void pqDelete( PriorityQ *pq, PQhandle handle );
  90. #define __gl_pqHeapMinimum(pq) ((pq)->handles[(pq)->nodes[1].handle].key)
  91. #define __gl_pqHeapIsEmpty(pq) ((pq)->size == 0)
  92. #endif