diff options
| -rw-r--r-- | main.c | 95 |
1 files changed, 87 insertions, 8 deletions
@@ -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]); } } |
