Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <locale.h>
- #define HASHTAB_SIZE 256
- typedef struct listnode {
- char *value;
- struct listnode *next;
- }listnode;
- listnode *hashtab[HASHTAB_SIZE] = {NULL};
- listnode *hashtab_add (listnode *head, char *key) {
- if (head == NULL) {
- head = malloc(sizeof(*head));
- head->value = key;
- head->next = NULL;
- printf("Добавлено!\n");
- }
- else {
- listnode *node;
- node = malloc(sizeof(*node));
- node->value = key;
- node->next = head;
- head = node;
- printf("Добавлено!\n");
- }
- return head;
- }
- listnode *hashtab_delete (listnode *head, char *key) {
- if (head == NULL) {
- printf("Такого слова нет в словаре, удаление невозможно\n");
- return NULL;
- }
- if (head->value == key) {
- listnode *temp = head;
- head = temp->next;
- free(temp);
- printf("Удалено\n");
- return head;
- }
- else {
- listnode *prev = head, *curr = head->next;
- while (curr->value != key) {
- prev = curr;
- curr = curr->next;
- if (curr == NULL) {
- printf("Такого слова нет в словаре, удаление невозможно\n");
- return head;
- }
- }
- prev->next = curr->next;
- free(curr);
- return head;
- }
- }
- static const unsigned char T[256] = {
- 98, 6, 85,150, 36, 23,112,164,135,207,169, 5, 26, 64,165,219,
- 61, 20, 68, 89,130, 63, 52,102, 24,229,132,245, 80,216,195,115,
- 90,168,156,203,177,120, 2,190,188, 7,100,185,174,243,162, 10,
- 237, 18,253,225, 8,208,172,244,255,126,101, 79,145,235,228,121,
- 123,251, 67,250,161, 0,107, 97,241,111,181, 82,249, 33, 69, 55,
- 59,153, 29, 9,213,167, 84, 93, 30, 46, 94, 75,151,114, 73,222,
- 197, 96,210, 45, 16,227,248,202, 51,152,252,125, 81,206,215,186,
- 39,158,178,187,131,136, 1, 49, 50, 17,141, 91, 47,129, 60, 99,
- 154, 35, 86,171,105, 34, 38,200,147, 58, 77,118,173,246, 76,254,
- 133,232,196,144,198,124, 53, 4,108, 74,223,234,134,230,157,139,
- 189,205,199,128,176, 19,211,236,127,192,231, 70,233, 88,146, 44,
- 183,201, 22, 83, 13,214,116,109,159, 32, 95,226,140,220, 57, 12,
- 221, 31,209,182,143, 92,149,184,148, 62,113, 65, 37, 27,106,166,
- 3, 14,204, 72, 21, 41, 56, 66, 28,193, 40,217, 25, 54,179,117,
- 238, 87,240,155,180,170,242,212,191,163, 78,218,137,194,175,110,
- 43,119,224, 71,122,142, 42,160,104, 48,247,103, 15, 11,138,239
- };
- unsigned int hashtab_hash(char *key) {
- unsigned int h = strlen(key) % HASHTAB_SIZE;
- char *p;
- for (p = key; *p != '\0'; ++p) {
- h = T[h ^ (unsigned char)*p];
- }
- return h;
- }
- void hashtab_lookup (listnode *head, char *key) {
- if (head == NULL)
- printf ("Такого слова нет в словаре, добавьте его!\n");
- else {
- if (head->value == key)
- printf("Данное слово есть в словаре\n");
- else {
- if (head->next != NULL) {
- listnode *curr = head->next;
- while (curr->value != key) {
- curr = curr->next;
- if (curr == NULL)
- printf ("Такого слова нет в словаре, добавьте его!\n");
- }
- printf ("Данное слово есть в словаре\n");
- }
- else
- printf ("Такого слова нет в словаре, добавьте его!\n");
- }
- }
- }
- int main() {
- setlocale(LC_ALL, "Rus");
- char c;
- unsigned char *word;
- while (1) {
- c = getchar();
- fgets(word, 20, stdin);
- int index = hashtab_hash(word);
- if (c == '-')
- hashtab[index] = hashtab_delete(hashtab[index], word);
- else if (c == '+')
- hashtab[index] = hashtab_add(hashtab[index], word);
- else if (c == '?')
- hashtab_lookup(hashtab[index], word);
- else return 0;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement