Pagini recente » Cod sursa (job #3272875) | Cod sursa (job #2230783) | Cod sursa (job #986170) | Cod sursa (job #46164) | Cod sursa (job #791579)
Cod sursa(job #791579)
#include <stdio.h>
#include <stdlib.h>
#define HASH_SIZE 666013
struct hash_node {
struct hash_node *next;
int value;
};
struct hash_node *hash[HASH_SIZE];
void hash_init(struct hash_node **h)
{
int i;
for (i = 0; i < HASH_SIZE; i++)
hash[i] = NULL;
}
void hash_print(struct hash_node **h, int buckets)
{
int i;
for (i = 0; i < buckets; i++) {
printf("[%d]: ", i);
if (!h[i]) {
printf("(empty)\n");
} else {
struct hash_node *b = hash[i];
while(b) {
printf("%d ", b->value);
b = b->next;
}
printf("\n");
}
}
}
void hash_add(struct hash_node **h, int elem)
{
struct hash_node *node = malloc(sizeof(**h));
struct hash_node *walker, *prev;
int key;
if (!node) {
perror("Could not allocate memory for hash element\n");
return;
}
node->next = NULL;
node->value = elem;
key = elem % HASH_SIZE;
if (!h[key]) {
h[key] = node;
} else {
for (walker = h[key]; walker; prev = walker, walker = walker->next) {
if (walker->value == elem)
return;
}
prev->next = node;
}
}
void hash_del(struct hash_node **h, int elem)
{
int key;
struct hash_node *tmp, *walker, *prev;
key = elem % HASH_SIZE;
/* first node */
if (!h[key])
return;
if (!h[key]->next || h[key]->value == elem) {
tmp = h[key]->next;
free(h[key]);
h[key] = tmp;
}
for (walker = h[key]; walker; prev = walker, walker = walker->next) {
if (walker->value == elem) {
prev->next = walker->next;
free(walker);
break;
}
}
}
int hash_search(struct hash_node **h, int elem)
{
int key;
struct hash_node *walker;
key = elem % HASH_SIZE;
if (!h[key])
return 0;
for (walker = h[key]; walker; walker = walker->next)
if (walker->value == elem)
return 1;
return 0;
}
int main(void)
{
int N, op, x, i;
hash_init(hash);
freopen("hashuri.in", "r", stdin);
freopen("hashuri.out", "w", stdout);
scanf("%d", &N);
for (i = 0; i < N; i++) {
scanf("%d %d", &op, &x);
if (op == 1)
hash_add(hash, x);
if (op == 2)
hash_del(hash, x);
if (op == 3)
printf("%d\n", hash_search(hash, x));
}
return 0;
}