diff --git a/a.out b/a.out index 1fbd779e432f2e38888994a22274d7ae67d21dee..6a41da0680bb893e0b03025c0ca50fefd8f88a81 100644 Binary files a/a.out and b/a.out differ diff --git a/t2.c b/t2.c index 47928afe0e01f38cb1d2430916a4d01b8114c1af..4e98f5a8b71598e21899786f78088067deecb299 100644 --- a/t2.c +++ b/t2.c @@ -21,25 +21,24 @@ typedef struct DHT { int max_id; } DHT; -void redistribute_keys(Node* new_node) { - Node* current = new_node; +void redistribute_keys(Node *dht, Node* new_node) { + Node *start = dht; do { - Node* next_node = current->next; - // Transferir chaves que são menores ou iguais ao id do próximo nó - for (int i = 0; i < current->key_count; i++) { - if ((current->keys[i] > current->id && current->keys[i] <= next_node->id) || - (current->id > next_node->id && (current->keys[i] > current->id || current->keys[i] <= next_node->id))) { - next_node->keys[next_node->key_count++] = current->keys[i]; - // Remover a chave do nó atual - for (int j = i; j < current->key_count - 1; j++) { - current->keys[j] = current->keys[j + 1]; - } - current->key_count--; - i--; // Reavaliar a posição atual + Node* current = new_node; + printf("Start:%d Next:%d\n", start->id, current->id); + printf("Start->key_count:%d\n", start->key_count); + //O novo nodo deve ter as chaves EXISTENTES que são maiores que o antecessor e menores ou iguais a ele + for (int i = 0; i < start->key_count; i++) { + printf("Start->keys[%d]:%d\n", i, start->keys[i]); + if (start->keys[i] > start->id && start->keys[i] <= current->id) { + printf("SAIA CHAVE SAIAAAA"); + current->keys[current->key_count++] = start->keys[i]; + start->keys[i] = 0; + start->key_count--; } } - current = next_node; - } while (current != new_node); + start = start->next; + } while (start != new_node); } // Função para criar um novo nó @@ -77,7 +76,7 @@ Node *insert_node(Node *head, int id, int max_id) { new_node->next = head; new_node->prev = last; head->prev = new_node; - redistribute_keys(new_node); + redistribute_keys(head, new_node); return new_node; // Novo nó se torna a nova cabeça } @@ -91,8 +90,7 @@ Node *insert_node(Node *head, int id, int max_id) { new_node->next = current; new_node->prev = prev; current->prev = new_node; - - redistribute_keys(new_node); + redistribute_keys(head, new_node); return head; } @@ -270,16 +268,14 @@ void insert_key(Node* head, int node_id, int key) { while (current->id != node_id) { current = current->next; } - do{ - if ((current->id < current->next->id && key > current->id && key <= current->next->id) || - (current->id > current->next->id && (key > current->id || key <= current->next->id))) { - current->next->keys[current->next->key_count++] = key; - printf("Chave %d inserida no nó %d\n", key, current->id); - return; - } - current = current->next; - } while (current != head); + //A partir no nosso nó, procuramos o próximo nó que cabe a chave + while(current->id < key && current != head){ + current = current->next; + } + + current->keys[current->key_count++] = key; + printf("Chave %d inserida no nó %d\n", key, current->id); } void imprime_chaves(Node* head) {