assignment_05.cpp (4951B)
1 /* Implement Doubly Linked List. Include functions for insertion, deletion and search of a number, reverse the list. */ 2 3 #include <iostream> 4 using namespace std; 5 6 typedef struct nodeType { 7 int data; 8 nodeType *prev = nullptr; 9 nodeType *next = nullptr; 10 } node; 11 12 class DoublyLinkedList { 13 private: 14 node *head; 15 16 public: 17 DoublyLinkedList() { head = nullptr; } 18 19 void insAtBegin() { 20 node *newNode = new node; 21 cout << "Enter the value: "; 22 cin >> newNode->data; 23 newNode->prev = nullptr; 24 newNode->next = head; 25 if (head != nullptr) head->prev = newNode; 26 head = newNode; 27 } 28 29 void insAtEnd() { 30 node *newNode = new node; 31 cout << "Enter the value: "; 32 cin >> newNode->data; 33 newNode->next = nullptr; 34 if (head == nullptr) { 35 newNode->prev = nullptr; 36 head = newNode; 37 } else { 38 node *temp = head; 39 while (temp->next != nullptr) temp = temp->next; 40 temp->next = newNode; 41 newNode->prev = temp; 42 } 43 } 44 45 void insAtPos() { 46 int pos; 47 cout << "Enter the position: "; 48 cin >> pos; 49 if (pos < 1) { cout << "Invalid Position!\n"; return; } 50 if (pos == 1) { insAtBegin(); return; } 51 node *temp = head; 52 for (int i = 1; i < pos - 1 && temp != nullptr; i++) temp = temp->next; 53 if (temp == nullptr) { cout << "Out of range!\n"; return; } 54 node *newNode = new node; 55 cout << "Enter the value: "; 56 cin >> newNode->data; 57 newNode->next = temp->next; 58 newNode->prev = temp; 59 if (temp->next != nullptr) temp->next->prev = newNode; 60 temp->next = newNode; 61 } 62 63 void delAtBegin() { 64 if (head == nullptr) { cout << "List is empty!\n"; return; } 65 node *temp = head; 66 head = head->next; 67 if (head != nullptr) head->prev = nullptr; 68 delete temp; 69 } 70 71 void delAtEnd() { 72 if (head == nullptr) { cout << "List is empty!\n"; return; } 73 if (head->next == nullptr) { delete head; head = nullptr; return; } 74 node *temp = head; 75 while (temp->next != nullptr) temp = temp->next; 76 temp->prev->next = nullptr; 77 delete temp; 78 } 79 80 void delAtPos() { 81 if (head == nullptr) { cout << "List is empty!\n"; return; } 82 int pos; 83 cout << "Enter the position: "; 84 cin >> pos; 85 if (pos < 1) { cout << "Invalid Position!\n"; return; } 86 if (pos == 1) { delAtBegin(); return; } 87 node *temp = head; 88 for (int i = 1; i < pos && temp != nullptr; i++) temp = temp->next; 89 if (temp == nullptr) { cout << "Out of range!\n"; return; } 90 if (temp->next != nullptr) temp->next->prev = temp->prev; 91 if (temp->prev != nullptr) temp->prev->next = temp->next; 92 delete temp; 93 } 94 95 void search() { 96 if (head == nullptr) { cout << "List is empty!\n"; return; } 97 int key, pos = 1; 98 cout << "Enter the element to search: "; 99 cin >> key; 100 node *temp = head; 101 while (temp != nullptr) { 102 if (temp->data == key) { cout << "Found at position: " << pos << "\n"; return; } 103 temp = temp->next; 104 pos++; 105 } 106 cout << "Element not found.\n"; 107 } 108 109 void reverse() { 110 if (head == nullptr || head->next == nullptr) return; 111 node *curr = head, *temp = nullptr; 112 while (curr != nullptr) { 113 temp = curr->prev; 114 curr->prev = curr->next; 115 curr->next = temp; 116 curr = curr->prev; 117 } 118 if (temp != nullptr) head = temp->prev; 119 } 120 121 void display() { 122 node *temp = head; 123 cout << "List: nullptr "; 124 while (temp != nullptr) { cout << temp->data << " "; temp = temp->next; } 125 cout << "nullptr\n"; 126 } 127 128 void printMenu() { 129 cout << "1.insertAtBegin 2.insertAtEnd 3.insertAtPos 4.deleteAtBegin 5.deleteAtEnd \n" 130 << "6.deleteAtPos 7.search 8.reverse 0.Display -1.Exit\n"; 131 } 132 133 ~DoublyLinkedList() { 134 node *temp; 135 while (head != nullptr) { temp = head; head = head->next; delete temp; } 136 } 137 }; 138 139 int main() { 140 DoublyLinkedList list; 141 int choice; 142 143 while (true) { 144 list.printMenu(); 145 cout << "Enter your choice: "; 146 cin >> choice; 147 148 switch (choice) { 149 case 1: list.insAtBegin(); break; 150 case 2: list.insAtEnd(); break; 151 case 3: list.insAtPos(); break; 152 case 4: list.delAtBegin(); break; 153 case 5: list.delAtEnd(); break; 154 case 6: list.delAtPos(); break; 155 case 7: list.search(); break; 156 case 8: list.reverse(); break; 157 case 0: list.display(); break; 158 case -1: cout << "Exiting...\n"; return 0; 159 default: cout << "Wrong choice. Try again.\n"; 160 } 161 } 162 }