assignment_02.cpp (9863B)
1 /* Linked List all operation */ 2 3 #include<iostream> 4 #include<iomanip> 5 using namespace std; 6 7 typedef struct nodeType { 8 int data; 9 nodeType *next = nullptr; 10 } node; 11 12 typedef struct MenuItem { 13 int id; 14 const char* name; 15 } menu; 16 17 typedef class singlyLinkedList { 18 private: 19 node *head = nullptr; 20 public: 21 // insertion 22 void insAtBegin(); 23 void insAtEnd(); 24 void insAtPos(); 25 void insBeforePos(); 26 void insAfterPos(); 27 28 // deletion 29 void delAtBegin(); 30 void delAtEnd(); 31 void delAtPos(); 32 void delBeforePos(); 33 void delAfterPos(); 34 35 void printMenu(); 36 void display(); 37 ~singlyLinkedList(); 38 } sl; 39 40 void sl :: printMenu() { 41 menu items[] = { 42 {1, "insertAtBegin()"}, {2, "insertAtEnd()"}, {3, "insertAtPos()"}, 43 {4, "insertBeforePos()"}, {5, "insertAfterPos()"}, {6, "deleteAtBegin()"}, 44 {7, "deleteAtEnd()"}, {8, "deleteAtPos()"}, {9, "deleteBeforePos()"}, 45 {10, "deleteAfterPos()"}, {0, "Display"}, {-1, "Exit"} 46 }; 47 48 cout << "\n## Choose from below --\n--------------------------------------------\n"; 49 for (int i = 0; i < 12; i++) { 50 cout << items[i].id << ". " << left << setw(20) << items[i].name; 51 if (i % 2 == 1) cout << "\n"; 52 } 53 } 54 55 void sl :: display() { 56 node *tmpNode = head; 57 cout << "\nCurrent Linked-List: "; 58 while(tmpNode != nullptr) { 59 cout << tmpNode -> data << " "; 60 tmpNode = tmpNode -> next; 61 } 62 cout << "nullptr\n"; 63 } 64 65 sl :: ~singlyLinkedList() { 66 node *tmpNode; 67 while(head != nullptr) { 68 tmpNode = head; 69 head = head -> next; 70 delete tmpNode; 71 } 72 cout << "\nMemory cleared!\nExit 0\n"; 73 } 74 75 void sl :: insAtBegin() { 76 node *newNode = new node; 77 cout << "\nEnter the value: "; 78 cin >> newNode -> data; 79 newNode -> next = head; 80 head = newNode; 81 cout << "\nNode added successfully!\n"; 82 } 83 84 void sl :: insAtEnd() { 85 node *newNode = new node; 86 cout << "\nEnter the value: "; 87 cin >> newNode -> data; 88 89 if(head == nullptr) { 90 head = newNode; 91 } else { 92 node *tmpNode = head; 93 while(tmpNode -> next != nullptr) { 94 tmpNode = tmpNode -> next; 95 } 96 tmpNode -> next = newNode; 97 } 98 cout << "\nNode added successfully!\n"; 99 } 100 101 void sl :: insAtPos() { 102 int pos; 103 cout << "\nEnter the position: "; 104 cin >> pos; 105 106 if(pos < 1) { 107 cout << "\nInvalid Position! Try again...\n"; 108 return; 109 } 110 111 if(pos == 1) { 112 insAtBegin(); 113 } else { 114 node *tmpNode = head; 115 for(int i = 1; i < pos - 1 && tmpNode != nullptr; i++) { 116 tmpNode = tmpNode -> next; 117 } 118 119 if(tmpNode == nullptr) { 120 cout << "\nOut of range! Try again...\n"; 121 return; 122 } 123 124 node *newNode = new node; 125 cout << "\nEnter the value: "; 126 cin >> newNode -> data; 127 newNode -> next = tmpNode -> next; 128 tmpNode -> next = newNode; 129 cout << "\nNode added successfully!\n"; 130 } 131 } 132 133 void sl :: insBeforePos() { 134 int pos; 135 cout << "\nEnter the position: "; 136 cin >> pos; 137 138 if(pos < 1) { 139 cout << "\nInvalid Position! Try again...\n"; 140 return; 141 } 142 143 if(pos == 1) { 144 insAtBegin(); 145 } else { 146 node *tmpNode = head; 147 node *tail = nullptr; 148 for(int i = 1; i < pos && tmpNode != nullptr; i++) { 149 tail = tmpNode; 150 tmpNode = tmpNode -> next; 151 } 152 153 if(tmpNode == nullptr) { 154 cout << "\nOut of range! Try again...\n"; 155 return; 156 } 157 158 node *newNode = new node; 159 cout << "\nEnter the value: "; 160 cin >> newNode -> data; 161 newNode -> next = tmpNode; 162 tail -> next = newNode; 163 cout << "\nNode added successfully!\n"; 164 } 165 } 166 167 void sl :: insAfterPos() { 168 int pos; 169 cout << "\nEnter the position: "; 170 cin >> pos; 171 172 if(pos < 0) { 173 cout << "\nInvalid position! Try again...\n"; 174 return; 175 } 176 177 node *tmpNode = head; 178 if(pos == 0) { 179 insAtBegin(); 180 } else { 181 for(int i = 1; i < pos && tmpNode != nullptr; i++) { 182 tmpNode = tmpNode -> next; 183 } 184 185 if(tmpNode == nullptr) { 186 cout << "\nOut of range! Try again...\n"; 187 return; 188 } 189 190 node *newNode = new node; 191 cout << "\nEnter the value: "; 192 cin >> newNode -> data; 193 newNode -> next = tmpNode -> next; 194 tmpNode -> next = newNode; 195 cout << "\nNode added successfully!\n"; 196 } 197 } 198 199 void sl :: delAtBegin() { 200 if(head == nullptr) { 201 cout << "\nUnable to process this request!\nLinked List is empty!\n"; 202 return; 203 } 204 node *tmpNode = head; 205 head = head -> next; 206 int tmpNodeData = tmpNode -> data; 207 delete tmpNode; 208 cout << "\nNode deleted successfully!\nDeleted node data: " << tmpNodeData << endl; 209 } 210 211 void sl :: delAtEnd() { 212 if(head == nullptr) { 213 cout << "\nUnable to process this request!\nLinked List is empty!\n"; 214 return; 215 } 216 217 if(head -> next == nullptr) { 218 int tmpNodeData = head -> data; 219 delete head; 220 head = nullptr; 221 222 cout << "\nNode deleted successfully!\nDeleted node data: " << tmpNodeData << endl; 223 return; 224 } 225 226 node *tmpNode = head; 227 while(tmpNode -> next -> next != nullptr) { 228 tmpNode = tmpNode -> next; 229 } 230 231 int tmpNodeData = tmpNode -> next -> data; 232 delete tmpNode -> next; 233 tmpNode -> next = nullptr; 234 cout << "\nNode deleted successfully!\nDeleted node data: " << tmpNodeData << endl; 235 } 236 237 void sl :: delAtPos() { 238 if(head == nullptr) { 239 cout << "\nUnable to process this request!\nLinked List is empty!\n"; 240 return; 241 } 242 243 int pos; 244 cout << "\nEnter the position: "; 245 cin >> pos; 246 247 if(pos < 1) { 248 cout << "\nInvalid Position! Try again...\n"; 249 return; 250 } 251 252 if(pos == 1) { 253 delAtBegin(); 254 } else { 255 node *tmpNode = head; 256 for(int i = 1; i < pos - 1 && tmpNode != nullptr; i++) { 257 tmpNode = tmpNode -> next; 258 } 259 260 if(tmpNode == nullptr || tmpNode -> next == nullptr) { 261 cout << "\nOut of range! Try again...\n"; 262 return; 263 } 264 265 node *tmpNode2 = tmpNode -> next; 266 int tmpNodeData = tmpNode -> next -> data; 267 tmpNode -> next = tmpNode -> next -> next; 268 delete tmpNode2; 269 cout << "\nNode deleted successfully!\nDeleted node data: " << tmpNodeData << endl; 270 } 271 } 272 273 void sl :: delBeforePos() { 274 if(head == nullptr) { 275 cout << "\nUnable to process this request!\nLinked List is empty!\n"; 276 return; 277 } 278 279 int pos; 280 cout << "\nEnter the position: "; 281 cin >> pos; 282 283 if(pos <= 1) { 284 cout << "\nInvalid position! Try again...\n"; 285 return; 286 } 287 288 if(pos == 2) { 289 delAtBegin(); 290 } else { 291 node *tmpNode = head; 292 node *tailNode = nullptr; 293 for(int i = 1; i < pos - 1 && tmpNode != nullptr; i++) { 294 tailNode = tmpNode; 295 tmpNode = tmpNode -> next; 296 } 297 298 if(tmpNode == nullptr) { 299 cout << "\nOut of range! Try again...\n"; 300 return; 301 } 302 303 tailNode -> next = tmpNode -> next; 304 int tmpNodeData = tmpNode -> data; 305 delete tmpNode; 306 cout << "\nNode deleted successfully!\nDeleted node data: " << tmpNodeData << endl; 307 } 308 } 309 310 void sl :: delAfterPos() { 311 if(head == nullptr) { 312 cout << "\nUnable to process this request!\nLinked List is empty!\n"; 313 return; 314 } 315 316 int pos; 317 cout << "\nEnter the position: "; 318 cin >> pos; 319 320 if(pos < 0) { 321 cout << "\nInvalid position! Try again...\n"; 322 return; 323 } 324 325 if(pos == 0) { 326 delAtBegin(); 327 } else { 328 node *tmpNode = head; 329 for(int i = 1; i < pos && tmpNode != nullptr; i++) { 330 tmpNode = tmpNode -> next; 331 } 332 333 if(tmpNode == nullptr || tmpNode -> next == nullptr) { 334 cout << "\nOut of range! Try again...\n"; 335 return; 336 } 337 338 node *tmpNode2 = tmpNode -> next; 339 int tmpNodeData = tmpNode2 -> data; 340 tmpNode -> next = tmpNode2 -> next; 341 delete tmpNode2; 342 cout << "\nNode deleted successfully!\nDeleted node data: " << tmpNodeData << endl; 343 } 344 } 345 346 int main() { 347 sl obj; 348 int choice; 349 while(1) { 350 obj.printMenu(); 351 cout << "Enter your choice: "; 352 cin >> choice; 353 switch(choice) { 354 case 1: 355 obj.insAtBegin(); 356 break; 357 case 2: 358 obj.insAtEnd(); 359 break; 360 case 3: 361 obj.insAtPos(); 362 break; 363 case 4: 364 obj.insBeforePos(); 365 break; 366 case 5: 367 obj.insAfterPos(); 368 break; 369 case 6: 370 obj.delAtBegin(); 371 break; 372 case 7: 373 obj.delAtEnd(); 374 break; 375 case 8: 376 obj.delAtPos(); 377 break; 378 case 9: 379 obj.delBeforePos(); 380 break; 381 case 10: 382 obj.delAfterPos(); 383 break; 384 case 0: 385 obj.display(); 386 break; 387 case -1: 388 cout << "\n\n\nExiting program.....\nTrying to clear memory....."; 389 return 0; 390 default: 391 cout << "\nEntered wrong choice.\n"; 392 } 393 } 394 } 395 396 /* 397 ===== Inputs to check every fns and edge cases ===== 398 399 0 400 6 401 7 402 8 403 9 404 10 405 3 -1 406 3 2 407 4 0 408 5 -1 409 5 1 410 1 100 411 0 412 8 2 413 9 1 414 10 1 415 7 416 0 417 2 10 418 2 20 419 2 30 420 2 40 421 1 5 422 3 3 15 423 4 6 25 424 5 2 8 425 5 0 2 426 0 427 8 4 428 9 4 429 10 0 430 10 5 431 0 432 -1 433 434 */