Skip to content

Commit 242af67

Browse files
committed
Fixed serious bug in pq_pop
1 parent cbdef4f commit 242af67

File tree

1 file changed

+21
-2
lines changed

1 file changed

+21
-2
lines changed

priority_queue.c

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,25 @@ PriorityQueue pq_init(const void **arr, int (*func)(const void *, const void *))
77
}
88

99
static void heapify(PriorityQueue *q, int i)
10+
{
11+
while(i*2<=q->n) {
12+
void **left = &q->data[i*2];
13+
void **right = &q->data[i*2+1];
14+
void **winner = (i*2+1>q->n)||q->compare(*left, *right)? left: right;
15+
if(q->compare(*winner, q->data[i])) {
16+
void *tmp = q->data[i];
17+
q->data[i] = *winner;
18+
*winner = tmp;
19+
} else
20+
break;
21+
if(winner == left)
22+
i=i*2;
23+
else
24+
i=i*2+1;
25+
}
26+
}
27+
28+
static void heapify_upward(PriorityQueue *q, int i)
1029
{
1130
while(i>=1) {
1231
void **left = &q->data[i*2];
@@ -27,7 +46,7 @@ void pq_push(PriorityQueue *q, const void *data)
2746
q->n++;
2847
q->data[q->n] = data;
2948
if(q->n>1) {
30-
heapify(q, q->n/2);
49+
heapify_upward(q, q->n/2);
3150
}
3251
}
3352

@@ -44,7 +63,7 @@ void pq_pop(PriorityQueue *q)
4463
q->data[1] = tmp;
4564

4665
q->n--;
47-
heapify(q, q->n/2);
66+
heapify(q, 1);
4867
}
4968

5069
void pq_refresh(PriorityQueue *q)

0 commit comments

Comments
 (0)