rendered paste body//Includes
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>
#include <iostream>
#include <fstream>
using std::cout;
using std::endl;
using std::ios;
using namespace std;
int NUMBUCKETS;
int OVERFLOW_BUCKET;
class Record{
public:
int key;
int data;
Record()
{
key = -1;
data = -1;
}
};
class Bucket{
public:
int bucket_id;
int next_bucket;
Record *bucket_record;
Bucket()
{
bucket_record = new Record[4];
bucket_id = -1;
next_bucket = -1;
}
};
class Hash_Table {
public:
int *index;
Bucket *hash_bucket;
Hash_Table()
{
index = new int[NUMBUCKETS];
hash_bucket = new Bucket[NUMBUCKETS];
}
int hash_function(int);
};
int Hash_Table::hash_function (int key)
{
int hash_index;
hash_index = key % NUMBUCKETS;
return hash_index;
}
void overflow_function(int new_bucket_id, int index_num, int key, int key_data, int full)
{
int j = 0;
Bucket new_bucket;
new_bucket.bucket_id = new_bucket_id;
for(int i = 0; i<4; i++)
{
j = -1;
if(new_bucket.bucket_record[i].data == -1)
{
j = i;
break;
}
}
if(j == -1)
{
if (new_bucket.next_bucket == -1)
{
OVERFLOW_BUCKET++;
cout << "Second overflow bucket, recurrsion" << endl;
new_bucket.next_bucket = OVERFLOW_BUCKET;
overflow_function(new_bucket.next_bucket, index_num, key, key_data, 1);
}
else
overflow_function(new_bucket.next_bucket,index_num, key, key_data, 0);
}
else
{
cout<< "new bucket id: " << new_bucket.bucket_id;
new_bucket.bucket_record[j].key= key;
cout << " Key from Overflow: " << new_bucket.bucket_record[j].key;
new_bucket.bucket_record[j].data= key_data;
cout << " Data from Overflow: " << new_bucket.bucket_record[j].data;
}
}
void write_head()
{
//fstream file;
fstream file("file2.txt", ios_base::in);
file.open("file2.txt");
file << "its bad file" << endl;
if(!file)
{
cout << "File does not exist" << endl;
file.open("file2.txt");
file.write("Hello Motto\n", 12);
//file << "its bad file" << endl;
//file << NUMBUCKETS;
}
else
{
//file.close();
//file.open("file2.txt");
//cout << "its a good file" <<endl;
file.write("I dont think so Motto\n", 22);
//file << "writing to the file" << endl;
//cout << "file does exist" << endl;
}
file.close();
}
int main()
{
int bucket_num = 0;
int insert_key;
int insert_data;
int key_index;
write_head();
cout << "\nEnter Bucket Number: ";
cin >> bucket_num;
NUMBUCKETS = bucket_num;
OVERFLOW_BUCKET = bucket_num;
Hash_Table hashing;
//Bucket creating_buckets;
for(int i = 0; i< NUMBUCKETS; i++)
{
hashing.index[i] = i;
hashing.hash_bucket[i].bucket_id = i + 1;
}
while (insert_key != 0 && insert_data != 0)
{
int j = -1;
cout << "\n Insert Key and its Data: ";
cin >> insert_key;
cin >> insert_data;
if (insert_key == 0 && insert_data == 0)
break;
key_index = hashing.hash_function(insert_key);
for(int i = 0; i<4; i++)
{
j = -1;
if(hashing.hash_bucket[key_index].bucket_record[i].data == -1)
{
j = i;
break;
}
}
if(j == -1)
{
if (hashing.hash_bucket[key_index].next_bucket == -1)
{
OVERFLOW_BUCKET++;
hashing.hash_bucket[key_index].next_bucket = OVERFLOW_BUCKET;
overflow_function(hashing.hash_bucket[key_index].next_bucket, key_index, insert_key, insert_data, 1);
}
else
overflow_function(hashing.hash_bucket[key_index].next_bucket,key_index, insert_key, insert_data, 0);
}
else
{
//inserts the initial first values in the bucket
hashing.hash_bucket[key_index].bucket_record[j].key= insert_key;
hashing.hash_bucket[key_index].bucket_record[j].data= insert_data;
}
}
for(int i = 0; i< NUMBUCKETS; i++)
{
for(int g=0;g<4;g++)
{
cout << "Index: " << hashing.index[i];
cout << " Bucket: " << hashing.hash_bucket[i].bucket_id;
cout << " Record: " << g << " Key: " << hashing.hash_bucket[i].bucket_record[g].key;
cout << " Data: " << hashing.hash_bucket[i].bucket_record[g].data << endl;
}
}
return 0;
}