update name of code to labcodes
This commit is contained in:
87
labcodes/lab8/libs/skew_heap.h
Normal file
87
labcodes/lab8/libs/skew_heap.h
Normal file
@@ -0,0 +1,87 @@
|
||||
#ifndef __LIBS_SKEW_HEAP_H__
|
||||
#define __LIBS_SKEW_HEAP_H__
|
||||
|
||||
struct skew_heap_entry {
|
||||
struct skew_heap_entry *parent, *left, *right;
|
||||
};
|
||||
|
||||
typedef struct skew_heap_entry skew_heap_entry_t;
|
||||
|
||||
typedef int(*compare_f)(void *a, void *b);
|
||||
|
||||
static inline void skew_heap_init(skew_heap_entry_t *a) __attribute__((always_inline));
|
||||
static inline skew_heap_entry_t *skew_heap_merge(
|
||||
skew_heap_entry_t *a, skew_heap_entry_t *b,
|
||||
compare_f comp);
|
||||
static inline skew_heap_entry_t *skew_heap_insert(
|
||||
skew_heap_entry_t *a, skew_heap_entry_t *b,
|
||||
compare_f comp) __attribute__((always_inline));
|
||||
static inline skew_heap_entry_t *skew_heap_remove(
|
||||
skew_heap_entry_t *a, skew_heap_entry_t *b,
|
||||
compare_f comp) __attribute__((always_inline));
|
||||
|
||||
static inline void
|
||||
skew_heap_init(skew_heap_entry_t *a)
|
||||
{
|
||||
a->left = a->right = a->parent = NULL;
|
||||
}
|
||||
|
||||
static inline skew_heap_entry_t *
|
||||
skew_heap_merge(skew_heap_entry_t *a, skew_heap_entry_t *b,
|
||||
compare_f comp)
|
||||
{
|
||||
if (a == NULL) return b;
|
||||
else if (b == NULL) return a;
|
||||
|
||||
skew_heap_entry_t *l, *r;
|
||||
if (comp(a, b) == -1)
|
||||
{
|
||||
r = a->left;
|
||||
l = skew_heap_merge(a->right, b, comp);
|
||||
|
||||
a->left = l;
|
||||
a->right = r;
|
||||
if (l) l->parent = a;
|
||||
|
||||
return a;
|
||||
}
|
||||
else
|
||||
{
|
||||
r = b->left;
|
||||
l = skew_heap_merge(a, b->right, comp);
|
||||
|
||||
b->left = l;
|
||||
b->right = r;
|
||||
if (l) l->parent = b;
|
||||
|
||||
return b;
|
||||
}
|
||||
}
|
||||
|
||||
static inline skew_heap_entry_t *
|
||||
skew_heap_insert(skew_heap_entry_t *a, skew_heap_entry_t *b,
|
||||
compare_f comp)
|
||||
{
|
||||
skew_heap_init(b);
|
||||
return skew_heap_merge(a, b, comp);
|
||||
}
|
||||
|
||||
static inline skew_heap_entry_t *
|
||||
skew_heap_remove(skew_heap_entry_t *a, skew_heap_entry_t *b,
|
||||
compare_f comp)
|
||||
{
|
||||
skew_heap_entry_t *p = b->parent;
|
||||
skew_heap_entry_t *rep = skew_heap_merge(b->left, b->right, comp);
|
||||
if (rep) rep->parent = p;
|
||||
|
||||
if (p)
|
||||
{
|
||||
if (p->left == b)
|
||||
p->left = rep;
|
||||
else p->right = rep;
|
||||
return a;
|
||||
}
|
||||
else return rep;
|
||||
}
|
||||
|
||||
#endif /* !__LIBS_SKEW_HEAP_H__ */
|
||||
Reference in New Issue
Block a user