Skip to content

Commit 4e8e5b5

Browse files
Merge pull request #219 from AyushAnand413/feature/menu-driven-linkedlist
Added MenuDrivenLinkedList.cpp implementation in C++
2 parents 98385fd + 636ef0d commit 4e8e5b5

1 file changed

Lines changed: 312 additions & 0 deletions

File tree

Lines changed: 312 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,312 @@
1+
2+
/*
3+
* Algorithm: Menu Driven Linked List
4+
* Description: Implementation of a linked list with menu options
5+
* (insert, delete, display,middle, exit and many more ).
6+
* Time Complexity: O(n) for insertion/search/deletion
7+
* Space Complexity: O(n)
8+
* Author: Ayush Kumar Anand
9+
* Date: 2025-10-01
10+
*/
11+
#include <iostream>
12+
using namespace std;
13+
14+
class LinkedList {
15+
private:
16+
struct Node {
17+
int data;
18+
Node* next;
19+
};
20+
Node* head = nullptr;
21+
22+
public:
23+
// Display list
24+
void display() {
25+
if (!head) {
26+
cout << "List is empty!\n";
27+
return;
28+
}
29+
cout << "Linked List: ";
30+
Node* temp = head;
31+
while (temp) {
32+
cout << temp->data << " -> ";
33+
temp = temp->next;
34+
}
35+
cout << "NULL\n";
36+
}
37+
38+
// Create list with n nodes
39+
void createList(int n) {
40+
head = nullptr;
41+
Node *temp = nullptr;
42+
for (int i = 0; i < n; i++) {
43+
int val;
44+
cout << "Enter value for node " << i + 1 << ": ";
45+
cin >> val;
46+
Node* newNode = new Node{val, nullptr};
47+
if (!head) {
48+
head = newNode;
49+
temp = head;
50+
} else {
51+
temp->next = newNode;
52+
temp = newNode;
53+
}
54+
}
55+
cout << "List created successfully\n";
56+
}
57+
58+
// Insert at beginning
59+
void insertAtBeginning(int val) {
60+
Node* newNode = new Node{val, head};
61+
head = newNode;
62+
}
63+
64+
// Insert at end
65+
void insertAtEnd(int val) {
66+
Node* newNode = new Node{val, nullptr};
67+
if (!head) {
68+
head = newNode;
69+
return;
70+
}
71+
Node* temp = head;
72+
while (temp->next) temp = temp->next;
73+
temp->next = newNode;
74+
}
75+
76+
// Insert at position
77+
void insertAtPosition(int pos, int val) {
78+
Node* newNode = new Node{val, nullptr};
79+
if (pos == 1) {
80+
newNode->next = head;
81+
head = newNode;
82+
return;
83+
}
84+
Node* temp = head;
85+
for (int i = 1; temp && i < pos - 1; i++) temp = temp->next;
86+
if (!temp) {
87+
cout << "Position out of range!\n";
88+
delete newNode;
89+
return;
90+
}
91+
newNode->next = temp->next;
92+
temp->next = newNode;
93+
}
94+
95+
// Insert after element
96+
void insertAfterElement(int element, int val) {
97+
Node* temp = head;
98+
while (temp && temp->data != element) temp = temp->next;
99+
if (!temp) {
100+
cout << "Element " << element << " not found!\n";
101+
return;
102+
}
103+
Node* newNode = new Node{val, temp->next};
104+
temp->next = newNode;
105+
cout << "Inserted " << val << " after " << element << "\n";
106+
}
107+
108+
// Delete first node
109+
void deleteFirst() {
110+
if (!head) {
111+
cout << "List is empty!\n";
112+
return;
113+
}
114+
Node* temp = head;
115+
head = head->next;
116+
cout << "Deleted node with value " << temp->data << "\n";
117+
delete temp;
118+
}
119+
120+
// Delete last node
121+
void deleteLast() {
122+
if (!head) {
123+
cout << "List is empty!\n";
124+
return;
125+
}
126+
if (!head->next) {
127+
cout << "Deleted node with value " << head->data << "\n";
128+
delete head;
129+
head = nullptr;
130+
return;
131+
}
132+
Node* temp = head;
133+
while (temp->next->next) temp = temp->next;
134+
cout << "Deleted node with value " << temp->next->data << "\n";
135+
delete temp->next;
136+
temp->next = nullptr;
137+
}
138+
139+
// Delete at position
140+
void deleteAtPosition(int pos) {
141+
if (!head) {
142+
cout << "List is empty!\n";
143+
return;
144+
}
145+
Node* temp = head;
146+
if (pos == 1) {
147+
head = head->next;
148+
cout << "Deleted node with value " << temp->data << " at position 1\n";
149+
delete temp;
150+
return;
151+
}
152+
for (int i = 1; temp && i < pos - 1; i++) temp = temp->next;
153+
if (!temp || !temp->next) {
154+
cout << "Wrong position!\n";
155+
return;
156+
}
157+
Node* del = temp->next;
158+
temp->next = del->next;
159+
cout << "Deleted node with value " << del->data << " at position " << pos << "\n";
160+
delete del;
161+
}
162+
163+
// Delete after element
164+
void deleteAfterElement(int element) {
165+
Node* temp = head;
166+
while (temp && temp->data != element) temp = temp->next;
167+
if (!temp) {
168+
cout << "Element " << element << " not found!\n";
169+
return;
170+
}
171+
if (!temp->next) {
172+
cout << "No node exists after element " << element << "\n";
173+
return;
174+
}
175+
Node* del = temp->next;
176+
temp->next = del->next;
177+
cout << "Deleted node with value " << del->data << " after element " << element << "\n";
178+
delete del;
179+
}
180+
181+
// Append another list
182+
void appendList() {
183+
int n, val;
184+
cout << "Enter number of nodes to append: ";
185+
cin >> n;
186+
if (n <= 0) {
187+
cout << "Nothing to append!\n";
188+
return;
189+
}
190+
Node* newHead = nullptr;
191+
Node* temp = nullptr;
192+
for (int i = 0; i < n; i++) {
193+
cout << "Enter value for node " << i + 1 << ": ";
194+
cin >> val;
195+
Node* newNode = new Node{val, nullptr};
196+
if (!newHead) {
197+
newHead = newNode;
198+
temp = newHead;
199+
} else {
200+
temp->next = newNode;
201+
temp = newNode;
202+
}
203+
}
204+
if (!head) {
205+
head = newHead;
206+
return;
207+
}
208+
temp = head;
209+
while (temp->next) temp = temp->next;
210+
temp->next = newHead;
211+
cout << "Another list appended successfully!\n";
212+
}
213+
214+
// Sort list
215+
void sortList() {
216+
if (!head) {
217+
cout << "List is empty!\n";
218+
return;
219+
}
220+
for (Node* i = head; i; i = i->next) {
221+
for (Node* j = i->next; j; j = j->next) {
222+
if (i->data > j->data) swap(i->data, j->data);
223+
}
224+
}
225+
cout << "List sorted successfully!\n";
226+
}
227+
228+
// Reverse print
229+
void reversePrint(Node* node) {
230+
if (!node) return;
231+
reversePrint(node->next);
232+
cout << node->data << " -> ";
233+
}
234+
void reverse() {
235+
cout << "Reversed List: ";
236+
reversePrint(head);
237+
cout << "NULL\n";
238+
}
239+
240+
// Display middle node
241+
void displayMiddle() {
242+
if (!head) {
243+
cout << "List is empty!\n";
244+
return;
245+
}
246+
Node* slow = head;
247+
Node* fast = head;
248+
while (fast && fast->next) {
249+
slow = slow->next;
250+
fast = fast->next->next;
251+
}
252+
cout << "Middle node value: " << slow->data << "\n";
253+
}
254+
255+
// Count nodes
256+
int countNodes() {
257+
int count = 0;
258+
for (Node* temp = head; temp; temp = temp->next) count++;
259+
return count;
260+
}
261+
262+
// Find largest and smallest
263+
void findLargestSmallest() {
264+
if (!head) {
265+
cout << "List is empty!\n";
266+
return;
267+
}
268+
int largest = head->data;
269+
int smallest = head->data;
270+
for (Node* temp = head; temp; temp = temp->next) {
271+
if (temp->data > largest) largest = temp->data;
272+
if (temp->data < smallest) smallest = temp->data;
273+
}
274+
cout << "Largest = " << largest << ", Smallest = " << smallest << "\n";
275+
}
276+
};
277+
278+
int main() {
279+
LinkedList list;
280+
int choice, n, val, pos, element;
281+
282+
while (true) {
283+
cout << "\n--- Linked List Menu ---\n";
284+
cout << "0. Display\n1. Create a single linked list\n2. Insert at beginning\n3. Insert at end\n";
285+
cout << "4. Insert at ith position\n5. Insert after element\n6. Delete first node\n7. Delete last node\n";
286+
cout << "8. Delete at ith position\n9. Delete after element\n11. Append another list\n12. Sort list\n";
287+
cout << "13. Print reversed list\n14. Display middle node\n15. Count nodes\n16. Find largest & smallest\n18. EXIT\n";
288+
cout << "Enter your choice: ";
289+
cin >> choice;
290+
291+
switch (choice) {
292+
case 0: list.display(); break;
293+
case 1: cout << "Enter number of nodes: "; cin >> n; list.createList(n); break;
294+
case 2: cout << "Enter value: "; cin >> val; list.insertAtBeginning(val); break;
295+
case 3: cout << "Enter value: "; cin >> val; list.insertAtEnd(val); break;
296+
case 4: cout << "Enter position and value: "; cin >> pos >> val; list.insertAtPosition(pos, val); break;
297+
case 5: cout << "Enter element and value: "; cin >> element >> val; list.insertAfterElement(element, val); break;
298+
case 6: list.deleteFirst(); break;
299+
case 7: list.deleteLast(); break;
300+
case 8: cout << "Enter position to delete: "; cin >> pos; list.deleteAtPosition(pos); break;
301+
case 9: cout << "Enter element after which to delete: "; cin >> element; list.deleteAfterElement(element); break;
302+
case 11: list.appendList(); break;
303+
case 12: list.sortList(); break;
304+
case 13: list.reverse(); break;
305+
case 14: list.displayMiddle(); break;
306+
case 15: cout << "Total nodes: " << list.countNodes() << "\n"; break;
307+
case 16: list.findLargestSmallest(); break;
308+
case 18: exit(0);
309+
default: cout << "Invalid choice!\n"; break;
310+
}
311+
}
312+
}

0 commit comments

Comments
 (0)