aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main.c47
1 files changed, 38 insertions, 9 deletions
diff --git a/main.c b/main.c
index 9327660..c8b0e51 100644
--- a/main.c
+++ b/main.c
@@ -103,12 +103,10 @@ void remove_element(element* el) {
free(el);
}
-void remove_parents(int id, parent** parents) {
+void remove_parents(parent* p) {
parent* temp;
- parent* p = parents[id];
- while (p != NULL) {
- remove_element(p->pos);
- temp = p;
+ while (temp = p) {
+ remove_element(temp->pos);
p = p->next;
free(temp);
}
@@ -126,8 +124,26 @@ void remove_bucket(bucket* b) {
void demote(set* s) {
detach_set(s);
- int size = s->bucket->size;
+ int size = s->bucket->size - 1;
+ bucket *;
+ if (!s->bucket->head) {
+ if(s->bucket->prev) {
+ remove_bucket(s->bucket);
+ } else {
+ attach
+ }
+
+ remove_bucket(s->bucket);
+ }
+
+ if (size == 0) {
+ free(s);
+ }
+
bucket* attach_point;
+ lse {
+ if(s->bucket->
+ }
if (s->bucket->prev) {
attach_point = s->bucket->prev;
} else if (s->bucket->head) {
@@ -157,15 +173,28 @@ void attach_set(set* s, int size, bucket* b) {
bucket* nb = new_bucket(s, size);
nb->prev = b;
nb->next = b->next;
+ nb->prev->next = nb;
+ nb->next->prev = nb;
}
}
void greedy(bucket* head, parent** parents) {
bucket* b = head;
- for(set* s=b->head; s != NULL; s = s->next) {
- for (element* el = s->head; el != NULL; el = el->next) {
- remove_parents(el->id, parents);
+ element* current = b->head->head;
+ element* temp;
+ while (1) {
+ temp = current;
+ if (current->next) {
+ current = current->next;
+ } else if (current->set->next) {
+ current = current->set->next->head;
+ } else if (current->set->bucket->prev) {
+ current = current->set->bucket->prev->head->head;
+ } else {
+ remove_parents(parents[temp->id]);
+ break;
}
+ remove_parents(parents[temp->id]);
}
}