#include <stdio.h> #define HEAPSIZ 1024
typedef int Node;
typedef struct { Node val[HEAPSIZ]; int _last; }Heap;
inline int cmp(register const Node* lhs, register const Node* rhs) { return *lhs - *rhs; }
inline void swap(register Node* lhs, register Node* rhs) { Node tmp = *lhs; *lhs = *rhs, * rhs = tmp; }
void insNode(register Heap* heap, register Node val) { heap->val[++heap->_last] = val; int now = heap->_last, base = now >> 1; while (base && cmp(&heap->val[base], &heap->val[now]) < 0) swap(&heap->val[now], &heap->val[base]), now >>= 1, base >>= 1; }
Node delNode(register Heap* heap) { swap(&heap->val[1], &heap->val[heap->_last--]); int now = 1, derived = 2; while (derived <= heap->_last) { if (cmp(&heap->val[derived], &heap->val[derived + 1]) < 0 && derived < heap->_last) derived++; if (cmp(&heap->val[derived], &heap->val[now]) < 0) break; swap(&heap->val[derived], &heap->val[now]), now <<= 1, derived <<= 1; } }
int main() { Heap heap = { 0 }; insNode(&heap, 5); insNode(&heap, 9); insNode(&heap, 1); insNode(&heap, 9); insNode(&heap, 7); printf("%d\n", heap.val[1]); delNode(&heap); printf("%d\n", heap.val[1]); delNode(&heap); printf("%d\n", heap.val[1]); delNode(&heap); printf("%d\n", heap.val[1]); delNode(&heap); printf("%d\n", heap.val[1]); delNode(&heap); return 0; }
|