#include <stdio.h>
#define SIZE 100000
typedef struct node{
int key;
struct node* next;
struct node* pre;
}Node;
Node HashTable[SIZE + 10];
Node HashPool[SIZE + 10];
int HashIndex = 0;
Node* getnew(){
return &HashPool[HashIndex++];
}
void insertnode(int key, Node*newnode){
Node * dst = &HashTable[key];
newnode->pre = dst;
newnode->next = dst->next;
dst->next = newnode;
dst->next->pre = newnode;
}
int getkey(int val){
return val % (SIZE + 3);
}
void deletenode(Node*x){
x->pre->next = x->next;
x->next->pre = x->pre;
}
Node* searchnode(Node* node){
int key = getkey(node->key);
Node* x = HashTable[key].next;
while (x != &HashTable[key] && x->key != key){
x = x->next;
}
return x;
}
void initHash(){
HashIndex = 0;
for (int i = 0; i < SIZE; i++){
HashTable[i].key = 0;
HashTable[i].next = &HashTable[i];
HashTable[i].pre = &HashTable[i];
}
}
int main(){
initHash();
for (int i = 10000; i < 40000; i++){
Node*newnode = getnew();
newnode->key = i;
int hashkey = getkey(i);
insertnode(hashkey,newnode);
Node *node = searchnode(newnode);
printf("%x %d
",node,node->key);
}
return 0;
}