Untitled
unknown
plain_text
a year ago
11 kB
9
Indexable
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct Node { int key; struct Node* next; } *Node; typedef struct NodeO { int *keys; int *ocupado; } NodeO; typedef struct NodeC{ int *slot[2]; int *ocupado[2]; } NodeC; Node* criaHT(int size) { Node* table = malloc(sizeof(Node) * size); for(int i=0; i<size; i++) table[i] = NULL; return table; } int hash(int key, int size) { return key % size; } Node criaN(int key) { Node newNode = malloc(sizeof(Node)); newNode->key = key; newNode->next = NULL; return newNode; } void insereL(Node* table, int key, int size) { int index = hash(key, size); Node newNode = criaN(key); if(table[index] == NULL) { table[index] = newNode; printf("%d -> %d\n", index, key); printf("OK\n"); } else { Node temp = table[index]; //loop para checkar se a key ja existe while(temp != NULL) { if(temp->key == key) { printf("Key %d EXISTS\n", key); return; } temp = temp->next; } newNode->next = table[index];//adicionar na head table[index] = newNode; printf("%d -> %d\n", index, key); printf("OK\n"); } } void apagaL(Node* table, int key, int size) { int index = hash(key, size); Node temp = table[index]; Node prev = NULL; while(temp != NULL) { if(temp->key == key) { if(prev == NULL) { table[index] = temp->next; } else { prev->next = temp->next; } free(temp); printf("OK\n"); return; } prev = temp; temp = temp->next; } printf("NO\n"); } void pesquisaL(Node* table, int key, int size) { int index = hash(key, size); Node temp = table[index]; while(temp != NULL) { if(temp->key == key) { printf("%d\n", index); return; } temp = temp->next; } printf("NO\n"); } void printL(Node* table, int size) { for(int i=0; i<size; i++) { Node temp = table[i]; if(temp != NULL) { printf("%d", i); while(temp != NULL) { printf(" %d", temp->key); temp = temp->next; } printf("\n"); } } } //------------------------- int existeO(NodeO* table, int key, int size){ int index = hash(key, size); int aux = key; int i = 0; for(; i < size+1;i++){ if (table->keys[index] == key) return index; index = hash(aux++,size); } return -1; } NodeO* criaO (int size){ NodeO* table = malloc(sizeof(NodeO)); table->keys = malloc(sizeof(int) * size); table->ocupado = malloc(sizeof(int) * size); for (int i = 0; i < size; i++) { table->keys[i] = -1;//N PODE SER 0 table->ocupado[i] = 0; } return table; } int insereO(NodeO* table, int key, int size) { int index = hash(key, size); int existe = existeO(table,key,size); int count = 0; int del = -1; while (count != size+1){ if((table->ocupado[index] == 0 || table->ocupado[index] == del) && existe == -1) { table->keys[index] = key; table->ocupado[index] = 1; printf("%d -> %d\n", index, key); printf("OK\n"); return 0; } else if(existe!=-1){ printf("%d EXISTS\n",table->keys[existe]); for (int i = 0; i < size; i++) { if (table->ocupado[index] != 1) { table->keys[index] = key; table->ocupado[index] = 1; table->keys[existe] = -1; table->ocupado[existe] = del; return 0; } else if(table->ocupado[index] == 1 && table->keys[index]==key){ return 0; } index = (index + 1) % size; } } else if (table->ocupado[index]==1){ index = (index + 1) % size; count++; } } printf("GIVING UP!\n"); return 6; } void apagaO(NodeO* table, int key, int size){ int index = hash(key, size); int del = -1; int count = 0; while (count!=size+1){ if(table->keys[index]==key){ table->ocupado[index] = del; printf("OK\n"); return; } else { if(table->keys[index]!=key) index = (index + 1) % size; count++; } } printf("NO\n"); return; } int pesquisaO(NodeO* table, int key, int size){ int index = hash(key,size); int count = 0; int delIndex = -1; while(count != size){ if (table->ocupado[index] == -1 && delIndex == -1){ delIndex = index; } if (table->keys[index] == key && table->ocupado[index] == 1){ if (delIndex != -1) { table->keys[delIndex] = key; table->ocupado[delIndex] = 1; table->keys[index] = -1; table->ocupado[index] = -1; printf("%d\n",delIndex); } else { printf("%d\n",index); } return 0; } index = (index + 1) % size; count++; } printf("NO\n"); return 0; } void printO(NodeO* table, int size){ for(int i = 0; i < size;i++){ if(table->ocupado[i]!=0){ if(table->ocupado[i] == -1) printf("%d\t%c\n",i,'D'); else printf("%d\t%d\n",i,table->keys[i]); } } } //-------------------------------------------------- int hash2(int key, int size) { return (key/size) % size; } NodeC* criaHTC(int size) { NodeC* table = malloc(sizeof(NodeC)); for(int i=0; i<2; i++) { table->slot[i] = malloc(sizeof(int) * size); table->ocupado[i] = malloc(sizeof(int) * size); for(int j=0; j<size; j++) { table->ocupado[i][j] = 0; } } return table; } int insereC(NodeC* table, int key, int size) { int n = 0; while (n <=size) { for(int j=0; j<2; j++) { int h = j == 0 ? hash(key, size) : hash2(key, size); if (!table->ocupado[j][h]) { table->slot[j][h] = key; table->ocupado[j][h] = 1; printf("%d %d -> %d\n", j, h, key); printf("OK\n"); return 0; } else { int temp = table->slot[j][h]; table->slot[j][h] = key; key = temp;//*** printf("%d %d -> %d\n", j, h, table->slot[j][h]); n++; } if (n==size+1){ printf("GIVING UP!\n"); return 6; } } } return 0; } void pesquisaC(NodeC* table, int key, int size) { for(int j=0; j<2; j++) { int h = j == 0 ? hash(key, size) : hash2(key, size); if (table->ocupado[j][h] && table->slot[j][h] == key) { printf("%d\t%d\n", j, h); return; } } printf("NO\n"); } void apagaC(NodeC* table, int key, int size) { for(int j=0; j<2; j++) { int h = j == 0 ? hash(key, size) : hash2(key, size); if (table->ocupado[j][h] && table->slot[j][h] == key) { table->ocupado[j][h] = 0; printf("OK\n"); return; } } printf("NO\n"); } void printC(NodeC* table, int size) { for(int j=0; j<2; j++) { for(int i=0; i<size; i++) { if (table->ocupado[j][i]) { printf("%d\t%d\t%d\n", j, i, table->slot[j][i]); } } } } int openO(char* operacao, int key, int size, NodeO* table, int (*insereO)(NodeO*, int, int), void (*apagaO)(NodeO*, int, int), int (*pesquisaO)(NodeO*, int, int), void (*printO)(NodeO*, int)) { if (strcmp(operacao, "I") == 0) { if (insereO(table, key, size)==6) return -1; else return 0; } else if (strcmp(operacao, "P") == 0) { printO(table, size); } else if (strcmp(operacao, "D") == 0) { apagaO(table, key, size); } else if (strcmp(operacao, "C") == 0) { pesquisaO(table, key, size); } return 0; } void link(char* operacao, int key, int size, Node* table, void (*insereL)(Node*, int, int), void (*apagaL)(Node*, int, int), void (*pesquisaL)(Node*, int, int), void (*printL)(Node*, int)) { if (strcmp(operacao, "I") == 0) { insereL(table, key, size); } else if (strcmp(operacao, "P") == 0) { printL(table, size); } else if (strcmp(operacao, "D") == 0) { apagaL(table, key, size); } else if (strcmp(operacao, "C") == 0) { pesquisaL(table, key, size); } } int cuckoo(char* operacao, int key, int size, NodeC* table, int (*insereC)(NodeC*, int, int), void (*apagaC)(NodeC*, int, int), void (*pesquisaC)(NodeC*, int, int), void (*printC)(NodeC*, int)) { if (strcmp(operacao, "I") == 0) { if (insereC(table, key, size)==6) return -1; else return 0; } else if (strcmp(operacao, "P") == 0) { printC(table, size); } else if (strcmp(operacao, "D") == 0) { apagaC(table, key, size); } else if (strcmp(operacao, "C") == 0) { pesquisaC(table, key, size); } return 0; } int main() { int size; char conflito[10]; if (scanf("%d", &size) != 1 || scanf("%s ", conflito) !=1 ) { return 0; } if (strcmp(conflito, "LINK") != 0 && strcmp(conflito, "OPEN") != 0 && strcmp(conflito, "CUCKOO") != 0) { return 0; } char operacao[10]; int key; int resultado; char input[100]; Node* table = criaHT(size); NodeO* tableO = criaO(size); NodeC* tableC = criaHTC(size); while (fgets(input, sizeof(input), stdin)) { resultado = sscanf(input, "%s %d", operacao,&key); if(resultado < 1) break; if(strcmp(conflito,"LINK")==0){ link(operacao, key, size, table, insereL, apagaL, pesquisaL, printL); } else if(strcmp(conflito,"OPEN")==0){ if (openO(operacao, key, size, tableO, insereO, apagaO, pesquisaO, printO)==-1) return 0; } else if(strcmp(conflito,"CUCKOO")==0){ if (cuckoo(operacao,key,size,tableC,insereC,apagaC,pesquisaC,printC)==-1) return 0; } else return 0; } }
Editor is loading...
Leave a Comment