Skip to content

Commit 7f2e849

Browse files
committed
Linked Lists: Program 7 to 11
1 parent 65d80b4 commit 7f2e849

6 files changed

+1885
-0
lines changed

26_linked_lists/07_input.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
4
2+
5
3+
9
4+
10
5+
3
6+
19
7+
7
8+
-1
Lines changed: 302 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,302 @@
1+
/*
2+
TOPIC: Linked List - Taking Input
3+
4+
- Taking input from user
5+
- Taking input from file
6+
*/
7+
8+
#include <iostream>
9+
using namespace std;
10+
11+
class Node{
12+
public:
13+
int data;
14+
Node *next;
15+
16+
// constructor
17+
Node(int d)
18+
{
19+
data = d;
20+
next = NULL;
21+
}
22+
};
23+
24+
25+
// pass a pointer by reference (because we want to make changes to the original head pointer)
26+
void insertAtHead(Node *&head, int d)
27+
{
28+
if(head == NULL)
29+
{
30+
head = new Node(d);
31+
return;
32+
}
33+
34+
Node *n = new Node(d);
35+
n->next = head;
36+
head = n;
37+
}
38+
39+
40+
41+
// function to find length of linked list
42+
int length(Node*head)
43+
{
44+
int cnt = 0;
45+
while(head != NULL)
46+
{
47+
cnt++;
48+
head = head->next;
49+
}
50+
return cnt;
51+
}
52+
53+
54+
55+
// function to insert data at last position of linked list
56+
void insertAtTail(Node*&head, int data)
57+
{
58+
// corner case
59+
if(head == NULL)
60+
{
61+
// Node *n = new Node(data);
62+
// head = n;
63+
head = new Node(data);
64+
return;
65+
}
66+
Node *tail = head; // using temp pointer
67+
// Moving head towards tail
68+
while(tail->next != NULL)
69+
{
70+
tail = tail->next;
71+
}
72+
// create & attach new node
73+
tail->next = new Node(data);
74+
}
75+
76+
77+
78+
// function to insert data at middle of linked list
79+
void insertAtMiddle(Node*&head, int data, int pos)
80+
{
81+
//corner case
82+
if(head==NULL or pos==0)
83+
{
84+
insertAtHead(head, data);
85+
return;
86+
}
87+
else if (pos >= length(head))
88+
{
89+
insertAtTail(head, data);
90+
return;
91+
}
92+
// take pos-1 jumps
93+
int i=1;
94+
Node *temp = head;
95+
while(i < pos)
96+
{
97+
temp = temp->next;
98+
i++;
99+
}
100+
// create a new node
101+
Node *n = new Node(data);
102+
n->next = temp->next;
103+
temp->next = n;
104+
}
105+
106+
// pass by value (because we don't want to change the original head pointer)
107+
void print(Node *head)
108+
{
109+
while(head != NULL)
110+
{
111+
cout << head->data << " -> ";
112+
head = head->next;
113+
}
114+
cout << endl;
115+
}
116+
117+
118+
119+
// function to delete data at start of linked list
120+
void deleteAtHead(Node*&head)
121+
{
122+
if(head == NULL)
123+
{
124+
return;
125+
}
126+
Node*temp = head->next; // temp pointer is static. So it will be deleted at the end of function call
127+
delete head; // delete the Node whose address is stored in "head" pointer
128+
head = temp;
129+
}
130+
131+
132+
133+
// function to delete data at end of linked list
134+
void deleteAtTail(Node*&head)
135+
{
136+
if(head == NULL)
137+
{
138+
return;
139+
}
140+
Node *tail = head;
141+
Node *prev;
142+
// moving towards the end of linked list
143+
while(tail->next != NULL)
144+
{
145+
prev = tail;
146+
tail = tail->next;
147+
}
148+
delete tail; // delete the Node whose address is stored in "tail" pointer
149+
// delete prev->next; // prev->nex & tail are pointing towards same address
150+
prev->next = NULL;
151+
}
152+
153+
154+
155+
// function to delete data at end of linked list
156+
void deleteAtMiddle(Node*&head, int pos)
157+
{
158+
if(head==NULL)
159+
{
160+
return;
161+
}
162+
else if(pos >= length(head))
163+
{
164+
return;
165+
}
166+
// jump towards pos
167+
Node *temp = head;
168+
Node *prev;
169+
int i = 1;
170+
while(i <= pos)
171+
{
172+
prev = temp;
173+
temp = temp->next;
174+
i++;
175+
}
176+
prev->next = temp->next;
177+
delete temp; // delete the Node whose address is stored in "temp" pointer
178+
}
179+
180+
181+
// Search Operation
182+
// Linear Search
183+
bool search(Node*head, int key)
184+
{
185+
Node*temp = head;
186+
while(temp != NULL)
187+
{
188+
if(temp->data == key)
189+
{
190+
return true;
191+
}
192+
temp = temp->next;
193+
}
194+
// if key not found
195+
return false;
196+
}
197+
198+
199+
// Linear Search (recursively)
200+
bool searchRecursive(Node*head, int key)
201+
{
202+
//base case
203+
if(head == NULL)
204+
{
205+
return false;
206+
}
207+
//rec case
208+
if(head->data == key)
209+
{
210+
return true;
211+
}
212+
return searchRecursive(head->next, key);
213+
}
214+
215+
216+
// Linked List User Input
217+
void take_input(Node*&head)
218+
{
219+
//
220+
}
221+
222+
// Linked List User Input
223+
Node* take_input_2()
224+
{
225+
Node *head = NULL;
226+
227+
int data;
228+
cin >> data;
229+
230+
while(data != -1)
231+
{
232+
insertAtHead(head, data);
233+
// insertAtTail(head, data);
234+
cin >> data;
235+
}
236+
return head;
237+
/* NOTE: Since we are adding elements at "head" of linked list.
238+
So, we will be getting linked list in the reverse order.
239+
*/
240+
}
241+
242+
243+
// Linked List User Input [When taking Input from a file]
244+
Node* take_input_file()
245+
{
246+
Node *head = NULL;
247+
248+
int data;
249+
// cin >> data;
250+
251+
while(cin >> data)
252+
// while(data != -1)
253+
{
254+
insertAtHead(head, data);
255+
// cin >> data;
256+
}
257+
return head;
258+
/* NOTE: Since we are adding elements at "head" of linked list.
259+
So, we will be getting linked list in the reverse order.
260+
*/
261+
}
262+
263+
264+
265+
int main()
266+
{
267+
// since we don't have linked list class, we have to keep the track of head pointer
268+
Node *head = NULL; // to store address of the first node
269+
270+
/*
271+
insertAtHead(head,3);
272+
insertAtHead(head,9);
273+
insertAtHead(head,74);
274+
insertAtMiddle(head,44,3);
275+
insertAtTail(head,88);
276+
*/
277+
278+
// take input of linked list from user
279+
cout << "Enter Elements [Press -1 to Exit]: ";
280+
head = take_input_2();
281+
282+
// // take input from file "input.txt"
283+
// head = take_input_file();
284+
285+
cout << "Linked List: ";
286+
print(head);
287+
288+
return 0;
289+
}
290+
291+
292+
/*
293+
OUTPUT:
294+
295+
Case 1: [Input from USER]
296+
Enter Elements [Press -1 to Exit] : 6 5 10 9 7 3 -1
297+
Linked List : 3 -> 7 -> 9 -> 10 -> 5 -> 6
298+
299+
Case 2: [Input from FILE] (i.e In Terminal: program_file.cpp < input.txt)
300+
Linked List : -1 -> 7 -> 19 -> 3 -> 10 -> 9 -> 5 -> 4
301+
302+
*/

0 commit comments

Comments
 (0)