1 | /* $Id$Revision: */ |
2 | /* vim:set shiftwidth=4 ts=8: */ |
3 | |
4 | /************************************************************************* |
5 | * Copyright (c) 2011 AT&T Intellectual Property |
6 | * All rights reserved. This program and the accompanying materials |
7 | * are made available under the terms of the Eclipse Public License v1.0 |
8 | * which accompanies this distribution, and is available at |
9 | * http://www.eclipse.org/legal/epl-v10.html |
10 | * |
11 | * Contributors: See CVS logs. Details at http://www.graphviz.org/ |
12 | *************************************************************************/ |
13 | |
14 | #ifndef BinaryHeap_H |
15 | #define BinaryHeap_H |
16 | |
17 | #include "general.h" |
18 | #include "IntStack.h" |
19 | |
20 | /* binary heap code. |
21 | Caution: items inserted should be kept untouched, e.g., the value of the item should be kepted unchanged while the heap is still in use! |
22 | To change the valud of am item, use BinaryHeap_reset |
23 | */ |
24 | |
25 | struct BinaryHeap_struct { |
26 | int max_len;/* storage allocated for the heap */ |
27 | int len;/*number of elements in the heap so far. <= maxlen */ |
28 | void **heap; |
29 | int *id_to_pos;/* this array store the position of an item with ID. For ID that was not in use, |
30 | i.e., no in pos_to_id[1:len], |
31 | id_to_pos[id] = -1 |
32 | */ |
33 | int *pos_to_id;/* this array stores the ID of item at position pos. |
34 | pos_to_id[id_to_pos[i]] = i, for i not in the id_stack & i < length(id_stack)+len |
35 | id_to_pos[pos_to_id[i]] = i, 0 <= i < len |
36 | */ |
37 | IntStack id_stack;/* a stack that store IDs that is no longer used, to |
38 | be assigned to newly inserted elements. |
39 | For sanity check, the union of items in |
40 | the id_stack, and that is pos_to_id[1:len], |
41 | should form a set of contiguous numbers |
42 | {1, 2, ..., len, ...} |
43 | */ |
44 | int (*cmp)(void*item1, void*item2);/* comparison function. Return 1,0,-1 |
45 | if item1 >, =, < item2 */ |
46 | }; |
47 | |
48 | enum {BinaryHeap_error_malloc = -10}; |
49 | |
50 | typedef struct BinaryHeap_struct* BinaryHeap; |
51 | |
52 | BinaryHeap BinaryHeap_new(int (*cmp)(void*item1, void*item2)); |
53 | |
54 | |
55 | void BinaryHeap_delete(BinaryHeap h, void (*del)(void* item));/* delete not just the heap data structure, but also the data items |
56 | through a user supplied del function. */ |
57 | |
58 | int BinaryHeap_insert(BinaryHeap h, void *item);/* insert an item, and return its ID. |
59 | This ID can be used later to extract the item. ID |
60 | are always nonnegative. If the return value is |
61 | negative, it is an error message */ |
62 | |
63 | void* BinaryHeap_get_min(BinaryHeap h);/* return the min item */ |
64 | |
65 | void* (BinaryHeap h);/* return and remove the min item */ |
66 | |
67 | void* (BinaryHeap h, int id);/* extract an item with ID out and delete it */ |
68 | |
69 | void* BinaryHeap_get_item(BinaryHeap h, int id);/* get an item with ID out, without deleting */ |
70 | |
71 | int BinaryHeap_reset(BinaryHeap h, int id, void *item);/* reset value of an item with specified id. Return new pos. If ID is invalue, return -1 */ |
72 | |
73 | void BinaryHeap_print(BinaryHeap h, void (*pnt)(void*)); |
74 | |
75 | void BinaryHeap_sanity_check(BinaryHeap h); |
76 | |
77 | #endif |
78 | |