bsc

Comprehensive codebase and coursework for the 4-year B.Sc. Computer Science Honours degree (WBSU)

git clone https://github.com/notamitgamer/bsc.git
· rebuilt hourlyOpen on GitHub
root / semester_2 / assignments / assignment_05.cpp

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 }