aboutsummaryrefslogtreecommitdiffstats
path: root/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main.c')
-rw-r--r--main.c56
1 files changed, 53 insertions, 3 deletions
diff --git a/main.c b/main.c
index cf21b4d..9327660 100644
--- a/main.c
+++ b/main.c
@@ -99,14 +99,64 @@ void remove_element(element* el) {
} else {
el->set->head = el->next;
}
- //demote(el->set);
+ demote(el->set);
free(el);
}
void remove_parents(int id, parent** parents) {
- for(parent* p=parents[id]; p != NULL; p = p->next) {
+ parent* temp;
+ parent* p = parents[id];
+ while (p != NULL) {
remove_element(p->pos);
- free(p);
+ temp = p;
+ p = p->next;
+ free(temp);
+ }
+}
+
+void remove_bucket(bucket* b) {
+ if (b->prev) {
+ b->prev->next = b->next;
+ }
+ if (b->next) {
+ b->next->prev = b->prev;
+ }
+ free(b);
+}
+
+void demote(set* s) {
+ detach_set(s);
+ int size = s->bucket->size;
+ bucket* attach_point;
+ if (s->bucket->prev) {
+ attach_point = s->bucket->prev;
+ } else if (s->bucket->head) {
+ attach_point = s->bucket;
+ } else {
+
+ }
+ remove_bucket(s->bucket);
+ attach_set(s, size, b);
+}
+
+void detach_set(set* s) {
+ if (s->next) {
+ s->next->prev = s->prev;
+ }
+ if (s->prev) {
+ s->prev->next = s->next;
+ } else {
+ s->bucket->head = s->next;
+ }
+}
+
+void attach_set(set* s, int size, bucket* b) {
+ if (b->size == size) {
+ insert_set(s, b);
+ } else {
+ bucket* nb = new_bucket(s, size);
+ nb->prev = b;
+ nb->next = b->next;
}
}