Pagini recente » Cod sursa (job #538413) | Cod sursa (job #1503555) | Cod sursa (job #232792) | Cod sursa (job #23633) | Cod sursa (job #282205)
Cod sursa(job #282205)
// Who said C ain't fast?
#include <stdio.h>
#include <stdlib.h>
typedef unsigned int uint;
typedef unsigned long ulong;
typedef unsigned short int bool;
#define true 1
#define false 0
typedef struct node {
ulong data;
struct node * next;
} node;
#define HASH_PRIME 666013
#define HASH(X) ((X)%HASH_PRIME)
node * hashTable[HASH_PRIME];
void prepend(node * list[], ulong data) {
ulong hash = HASH(data);
node * traveler = list[hash];
bool found = false;
while(traveler) {
if(traveler->data == data) {
found = true;
break;
}
traveler = traveler->next;
}
if(!found) {
traveler = malloc(sizeof(node));
traveler->data = data;
traveler->next = list[hash];
list[hash] = traveler;
}
}
bool find(node * list[], ulong data) {
ulong hash = HASH(data);
node * traveler = list[hash];
bool found = false;
while(traveler) {
if(traveler->data == data) {
found = true;
break;
}
traveler = traveler->next;
}
return found;
}
void erase(node * list[], ulong data) {
ulong hash = HASH(data);
node * traveler = list[hash];
bool found = false;
while(traveler) {
if(traveler->data == data) {
found = true;
break;
}
traveler = traveler->next;
}
if(found) {
// Copy the data from the head into the node to be removed
traveler->data = list[hash]->data;
// We are now going to delete the head, since we already saved the data in it
// Copy a reference to the head pointer into traveler
traveler = list[hash];
// Advance the head pointer
list[hash] = list[hash]->next;
// Delete the traveler
free(traveler);
}
}
int main() {
freopen("hashuri.in", "r", stdin);
freopen("hashuri.out", "w", stdout);
ulong n, operation, param, i;
scanf("%u",&n);
for(i = 0; i < n; i++) {
scanf("%u%u", &operation, ¶m);
switch(operation) {
case 1:
prepend(hashTable, param);
break;
case 2:
erase(hashTable, param);
break;
case 3:
printf("%u\n", find(hashTable, param));
break;
}
}
return 0;
}