aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThibaut Horel <thibaut.horel@gmail.com>2015-07-01 22:27:48 -0700
committerThibaut Horel <thibaut.horel@gmail.com>2015-07-02 10:18:15 -0700
commitca00e84c08f91c783407f8e4e98fdff6b043aa05 (patch)
tree2be8603c89e5af71e07dd8aaad5bc3a4a73eec71
parentfae7e090e8cfb3ced688930c7f8ffa00a44a5ca7 (diff)
downloadcover-ca00e84c08f91c783407f8e4e98fdff6b043aa05.tar.gz
More code
-rw-r--r--main.c95
1 files changed, 87 insertions, 8 deletions
diff --git a/main.c b/main.c
index cf21b4d..c8b0e51 100644
--- a/main.c
+++ b/main.c
@@ -99,23 +99,102 @@ 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) {
- remove_element(p->pos);
- free(p);
+void remove_parents(parent* p) {
+ parent* temp;
+ while (temp = p) {
+ remove_element(temp->pos);
+ 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 - 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) {
+ 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;
+ 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]);
}
}