//Includes #include #include #include #include #include #include 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" <> 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; }