icp/oer/courses/c-advanced/sections/01-introduction/03-hashtable/program.c

111 lines
2.6 KiB
C

#include <stdio.h>
#include <stdlib.h>
#define HASH_TABLE_SIZE 32
// NOTE: the data is some value, which is on a certain 2D point (x,y)
typedef struct node
{
// the data
int x,y;
float Value;
// next entry in the hash-table, if there were a collision
struct node *Next;
}node;
#include "linked_list.h"
/*
* Linked-list interface
*
* void list_add(node **Head, int Value, int x, int y);
*
* node *list_get(node **Head, int x, int y);
*
* void list_remove(node **Head, node *Node);
*
*/
// NOTE: this computes the hash slot of the entry
int hash(int x, int y)
{
int Result = (x + y)%HASH_TABLE_SIZE;
if(Result < 0)
Result *= -1;
return Result;
}
// NOTE: adds a new entry to the hash table.
// new entries go at the head of the linked-list
void hash_add(node **HashTable, float Value, int x, int y)
{
// Don't forget to update the hash-tables pointer to the head.
}
// NOTE: gets the note at the position (x,y)
node *hash_get(node **HashTable, int x, int y)
{
return 0;
}
// NOTE: removes the node at position (x,y),
// if there is one
void hash_remove(node **HashTable, int x, int y)
{
}
int main(int argc, char *argv)
{
node *HashTable[HASH_TABLE_SIZE] = {};
// NOTE: some test values
hash_add(HashTable, 1.0, 1, 0);
hash_add(HashTable, 3.0, 0, 1);
hash_add(HashTable, 5.0, 3, -2);
hash_add(HashTable, 7.0, 10, 3);
// NOTE: test adding with collisions
node *Node = hash_get(HashTable, 1, 0);
if(Node)
printf("Succesfully added value %f at position (%d,%d) to the HashTable\n", Node->Value, Node->x, Node->y);
else
printf("Failed to add or find value 1 at position (1,0)\n");
Node = hash_get(HashTable, 0, 1);
int added01 = 0;
if(Node)
{
printf("Succesfully added value %f at position (%d,%d) to the HashTable\n", Node->Value, Node->x, Node->y);
added01 = 1;
}
else
printf("Failed to add or find value 3 at position (0,1)\n");
Node = hash_get(HashTable, 3, -2);
if(Node)
printf("Succesfully added value %f at position (%d,%d) to the HashTable\n", Node->Value, Node->x, Node->y);
else
printf("Failed to add or find value 5 at position (-2,-2)\n");
Node = hash_get(HashTable, 10, 3);
if(Node)
printf("Succesfully added value %f at position (%d,%d) to the HashTable\n", Node->Value, Node->x, Node->y);
else
printf("Failed to add or find value 7 at position (10,3)\n");
// NOTE: test removing element
if(added01)
{
hash_remove(HashTable, 0, 1);
Node = hash_get(HashTable, 0, 1);
if(!Node)
printf("Succesfully removed entrie at position (0,1) from the HashTable\n");
else
printf("Failed to remove entrie at position (0,1)\n");
}
}