Untitled
unknown
plain_text
2 years ago
6.5 kB
7
Indexable
Never
#assiignment_4 #include <bits/stdc++.h> using namespace std; #define ll long long static const int sizeOfTable = 10; static const int primeNo = 7; class Node { private: string name; ll phoneNo; int hashValue; Node *next; Node *prev; public: Node(string name, ll phoneNo, int hashValue) { next = NULL; prev = NULL; this->name = name; this->phoneNo = phoneNo; this->hashValue = hashValue; } string getName() { return this->name; } friend class LinkedList; }; class LinkedList { private: Node *head; public: int size; LinkedList() { head = NULL; size = 0; } void add(string name, ll phoneNo, int hashValue) { size++; if (head == NULL) { head = new Node(name, phoneNo, hashValue); return; } Node *temp = head; while (temp->next != NULL) { temp = temp->next; } Node *new1 = new Node(name, phoneNo, hashValue); new1->next = NULL; new1->prev = temp; temp->next = new1; } bool isEmpty() { return head == NULL; } ll get(string name) { Node *temp = head; while (temp != NULL) { if (temp->name != name) temp = temp->next; else { return temp->phoneNo; } } return -1; } void remove(int ind) { if (ind == 0) { Node *temp = head; temp = temp->next; temp->prev = NULL; head = temp; size--; return; } Node *previous = head; Node *after = head; for (int i = 0; i < ind - 1; i++) { previous = previous->next; after = after->next; } after = after->next; after = after->next; previous->next = after; after->prev = previous; size--; } void remove(string name) { Node *current = head; if (head->name == name) { head = head->next; head->prev = NULL; return; } else { bool found = false; while (current != NULL) { if (current->name == name) { found = true; Node *prev = current->prev; Node *next = current->next; prev->next = next; next->prev = prev; break; } else { current = current->next; } } if (!found) { cout << "The element is not present in the hashtable" << endl; } } } void print() { string arrow = " ---->"; if (head != NULL) { while (head != NULL) { cout << arrow << " { Name: " << head->name << ", No: " << head->phoneNo << ", Hash: " << head->hashValue << " }"; head = head->next; } } } }; class HashTable { private: LinkedList array[10]; int getHashValue(string name) { int strLength = name.length(); int hash = 0; for (int i = 0; i < strLength; i += 2) { hash += int(name[i]) * primeNo; } return hash; } int getTableIndex(int hash) { return hash % sizeOfTable; } string sizeOf10(string word) { string temp = word; while (temp.length() != 10) { temp.append(" "); } return temp; } public: HashTable() { for (int i = 0; i < sizeOfTable; i++) { array[i] = LinkedList(); } } void put(string name, ll phoneNo) { int hashValue = getHashValue(name); int hashIndex = getTableIndex(hashValue); array[hashIndex].add(name, phoneNo, hashValue); } ll get(string name) { int hashValue = getHashValue(name); int hashIndex = getTableIndex(hashValue); LinkedList temp = array[hashIndex]; ll phoneNo = temp.get(name); return phoneNo; } void remove(string name) { int hashValue = getHashValue(name); int hashIndex = getTableIndex(hashValue); LinkedList temp = array[hashIndex]; temp.remove(name); array[hashIndex] = temp; } void print() { cout << "\nThe HashTable with linked list is:\n"; cout << "------------\n" << "|Index |\n" << "|----------|\n"; for (int i = 0; i < sizeOfTable; i++) { cout << "|" << sizeOf10(to_string(i)) << "|"; LinkedList temp = array[i]; temp.print(); cout << "\n"; } cout << "------------\n"; } }; int main() { HashTable table = HashTable(); while (true) { table.print(); cout << "Menu:\n" << "1. Insert\n" << "2. Delete\n" << "3. Get\n" << "4. Print\n"; int code; cout << "Enter the code for the particular operation: "; cin >> code; string name; ll phoneNo; switch (code) { case 1: cout << "Enter the name and the phone no:\n"; cout << "Name: "; cin >> name; cout << "Phone no: "; cin >> phoneNo; table.put(name, phoneNo); break; case 2: cout << "Enter the name to be deleted\n"; cout << "Name: "; cin >> name; table.remove(name); break; case 3: cout << "Enter the name of whose phone no is to fetched:\n"; cout << "Name: "; cin >> name; phoneNo = table.get(name); if (phoneNo != -1) cout << "Phone no:" << phoneNo; else cout << "Not present in the table" << endl; break; case 4: table.print(); break; default: break; } cout << "Want to continue? 1/0 :"; int con; cin >> con; if (con == 0) { break; } } }