dsalglib  1.0.0
dsalglib is a ready to use data structures and algorithms library written in C++ . Object Oriented Template implementations are written.
linklist.h
Go to the documentation of this file.
1 //
2 // Created by moghya_s on 10/12/2016.
3 //
4 
5 #ifndef DSALGLIB_LINKLIST_H
6 #define DSALGLIB_LINKLIST_H
7 namespace dsa
8 {
9  template<class type>
10  class linklist
11  {
12  private:
13  struct lnode
14  {
15 
16  lnode *prev;
17  type data;
18  lnode *next;
19 
20  lnode()
21  {
22  prev = nullptr;
23  next= nullptr;
24  }
25 
26  lnode(type param)
27  {
28  prev = nullptr;
29  data = param;
30  next = nullptr;
31  }
32  };
33 
34  lnode* create_lnode(type param)
35  {
36  lnode *temp = new lnode(param);
37  return temp;
38  }
39 
40  lnode *start,*last;
41  long long int count;
42 
43  public:
45  {
46  start = nullptr;
47  last = nullptr ;
48  count = 0;
49  }
50 
51  /*
52  * Function: checks if list is empty
53  * Pre: none
54  * Post: Returns True if list is empty else False
55  */
56  bool isempty()
57  {
58  if(count==0)
59  return true;
60  else
61  return false;
62  }
63 
64  /*
65  * Function: Removes all lnodes and makes list empty
66  * Pre: none
67  * Post: none
68  */
69  void clear()
70  {
71  while(count!=0)
72  {
73  pop_back();
74  }
75  return;
76  }
77 
78  /*
79  *Function:Returns size of the list
80  *Pre: none
81  *Post: returns size of list;
82  */
83  long long int size()
84  {
85  return count;
86  }
87 
88  /*
89  * Function: '=' operator overloaded for copying contents of one list into other
90  * Pre: List to copy into
91  * Post: Copied
92  */
94  {
95  clear();
96  if(from.size()>0)
97  {
98  lnode *temp= from.start;
99  while(temp!=from.last)
100  {
101  add_back(temp->data);
102  temp=temp->next;
103  }
104  add_back(temp->data);
105  }
106  return;
107  }
108 
109  /*
110  * Function: '[]' operator overloaded for element access
111  * Pre: index of element to access
112  * Post: returns data value of element at index
113  */
114  type &operator[](long long int index)
115  {
116  if(index>=0&&index<count)
117  {
118  lnode *temp = start;
119  long long int counter = 0;
120  while(counter<index)
121  {
122  temp=temp->next;
123  counter++;
124  }
125  return temp->data;
126  }
127  }
128 
129  /*
130  * Function: adds lnode into list at end
131  * Pre: param of type type to add into list
132  * Post: param added into list at the last
133  */
134  void add_back(type param)
135  {
136 
137  lnode *temp = create_lnode(param);
138  if(start == nullptr)
139  {
140  temp->prev = nullptr;
141  start=temp;
142  last = temp;
143  last->next = start;
144  start->prev = last ;
145  }
146  else
147  {
148  last->next = temp;
149  temp->prev = last;
150  temp->next = start;
151  last = temp;
152  }
153  count++;
154  }
155 
156  /*
157  * Function: adds lnode into list at front
158  * Pre: param of type type to add into list
159  * Post: param added into list at the front
160  */
161  void add_front(type param)
162  {
163  lnode *temp = create_lnode(param);
164  if(start == nullptr)
165  {
166  temp->prev = nullptr;
167  start=temp;
168  last = temp;
169  last->next = start;
170  start->prev = last ;
171  }
172  else
173  {
174  temp->next = start;
175  start->prev = temp;
176  temp->prev = last;
177  start = temp;
178  }
179  count++;
180  }
181 
182  /*
183  * Function: deletes first lnode from list
184  * Pre: none
185  * Post: deletes first lnode
186  */
187  void pop_front()
188  {
189 
190  if(count>0)
191  {
192  lnode *temp = start,*another_temp;
193  if(count==1)
194  {
195  delete temp;
196  start = nullptr;
197  last = nullptr;
198  count--;
199  return ;
200  }
201  else
202  {
203  another_temp=temp->next;
204  delete temp;
205  another_temp->prev = last;
206  start = another_temp;
207  count--;
208  return ;
209  }
210  }
211  else
212  {
213  return ;
214  }
215 
216  }
217 
218  /*
219  * Function: deletes last lnode from list
220  * Pre: none
221  * Post: deletes last lnode
222  */
223  void pop_back()
224  {
225  if(count>0)
226  {
227  lnode *temp = last,*another_temp;
228  if(count==1)
229  {
230  delete temp;
231  start = nullptr;
232  last = nullptr;
233  count--;
234  return ;
235  }
236  else
237  {
238 
239  another_temp=temp->prev;
240  another_temp->next = start;
241  last = another_temp;
242  delete temp;
243  count--;
244  return ;
245  }
246 
247  }
248  else
249  {
250  return ;
251  }
252  }
253 
254  long long int search(type svalue)
255  {
256  if(count>0)
257  {
258  long long int i=0;
259  lnode *temp = start->next;
260  if(start->data==svalue) return 0;
261  if(last->data==svalue) return count-1;
262 
263  while(temp!=last)
264  {
265  i++;
266  if(temp->data==svalue)
267  return i;
268 
269  temp = temp->next;
270 
271  }
272  }
273  return -1;
274  }
275 
276  void remove(type rvalue)
277  {
278 
279  if(count>0)
280  {
281  lnode *temp = start->next,*another_temp=nullptr;
282  if(start->data==rvalue)
283  {
284  pop_front();
285  return ;
286  }
287  if(last->data==rvalue)
288  {
289  pop_back();
290  return ;
291  }
292  while(temp!=last)
293  {
294  if(temp->data==rvalue)
295  {
296  another_temp->next=temp->next;
297  delete temp;
298  return ;
299  }
300  another_temp = temp;
301  temp = temp->next;
302  }
303  }
304 
305  return ;
306  }
307 
308  /*
309  * Function: deletes lnode from list
310  * Pre: index of lnode to delete
311  * Post: deletes lnode at index
312  */
313  void remove_at(long long int index)
314  {
315 
316  if(index>=0&&index<count)
317  {
318 
319  if(index==0)
320  return pop_front();
321  if(index==count-1)
322  return pop_back();
323 
324  lnode *temp = start,*another_temp;
325  long long int counter = 1;
326  while(counter<index)
327  {
328  temp=temp->next;
329  counter++;
330  }
331  another_temp=temp->next->next;
332  delete temp->next;
333  temp->next = another_temp;
334  another_temp->prev = temp;
335  count--;
336  return ;
337  }
338  else
339  return ;
340  }
341 
342  void traverse(void (fun)(type obj))
343  {
344  long long int i;
345  lnode *temp=start;
346  for(i=0;i<count;i++)
347  {
348  fun(temp->data);
349  temp = temp->next;
350  }
351  }
352  };
353 }
354 #endif //DSALGLIB_LINKLIST_H
Definition: alginc.h:12