Cod sursa(job #791579)

Utilizator dbalutaDaniel Baluta dbaluta Data 24 septembrie 2012 16:54:12
Problema Hashuri Scor 60
Compilator c Status done
Runda Arhiva educationala Marime 2.05 kb
#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;
}