easy_linked_list/easy_linked_list/mod.rs
1struct Node<T> {
2 data: T,
3 next: Option<Box<Node<T>>>,
4}
5
6impl<T> Node<T> {
7 fn new(data: T) -> Self {
8 Node { data, next: None }
9 }
10}
11
12///this is unsize generic list for stored any type
13///
14///
15/// # Examples
16///
17/// ```
18///#[derive(Debug)] //struct example
19///struct Person {
20/// name: String,
21/// age: i32,
22///}
23///let mut persons = List::new(); //declare package
24///
25///persons.add(Person { name: "saeed".to_string(), age: 25 });// set element
26///
27/// ```
28pub struct List<T> {
29 head: Option<Box<Node<T>>>,
30}
31
32///this is unsize generic list for stored any type
33///
34///
35/// # Examples
36///
37/// ```
38///#[derive(Debug)] //struct example
39///struct Person {
40/// name: String,
41/// age: i32,
42///}
43///let mut persons = List::new(); //declare package
44///
45///persons.add(Person { name: "saeed".to_string(), age: 25 });// set element
46///
47/// ```
48impl<T> List<T> {
49 pub fn new() -> Self {
50 List { head: None }
51 }
52
53 ///this method used for insert in the list
54 ///
55 ///
56 /// # Examples
57 ///
58 /// ```
59 ///#[derive(Debug)] //struct example
60 ///struct Person {
61 /// name: String,
62 /// age: i32,
63 ///}
64 ///let mut persons = List::new(); //declare package
65 ///
66 ///persons.add(Person { name: "saeed".to_string(), age: 25 });// insert element
67 ///
68 /// ```
69 pub fn add(&mut self, data: T) {
70 let new_node = Box::new(Node::new(data));
71 match self.head {
72 Some(ref mut head) => {
73 let mut current = head;
74 while let Some(ref mut next_node) = current.next {
75 current = next_node;
76 }
77 current.next = Some(new_node);
78 }
79 None => {
80 self.head = Some(new_node);
81 }
82 }
83 }
84
85 ///this method used for remove all elements in the list
86 ///
87 ///
88 /// # Examples
89 ///
90 /// ```
91 ///#[derive(Debug)] //struct example
92 ///struct Person {
93 /// name: String,
94 /// age: i32,
95 ///}
96 ///let mut persons = List::new(); //declare package
97 ///
98 ///persons.clear();// remove all elements
99 ///
100 /// ```
101 pub fn clear(&mut self) {
102 self.head = None;
103 }
104
105 ///this method used for insert in the list
106 ///
107 ///# Arguments
108 ///
109 /// * `index` - index of the value you want to get from list.
110 ///
111 ///
112 /// # Examples
113 ///
114 /// ```
115 ///#[derive(Debug)] //struct example
116 ///struct Person {
117 /// name: String,
118 /// age: i32,
119 ///}
120 ///let mut persons = List::new(); //declare package
121 ///
122 ///persons.add(Person { name: "saeed".to_string(), age: 25 });// set element index=>0
123 ///persons.add(Person { name: "safi".to_string(), age: 26 });// set element index=>1
124 ///
125 ///persons.get_by_index(1);// get element by index
126 ///
127 /// ```
128 pub fn get_by_index(&self, index: usize) -> Option<&T> {
129 let mut current = &self.head;
130 let mut current_index = 0;
131 while let Some(ref node) = *current {
132 if current_index == index {
133 return Some(&node.data);
134 }
135 current_index += 1;
136 current = &node.next;
137 }
138 None
139 }
140
141 ///this method used for remove element with specefic index
142 ///
143 ///# Arguments
144 ///
145 /// * `index` - index of the value you want to get from list.
146 ///
147 ///
148 /// # Examples
149 ///
150 /// ```
151 ///#[derive(Debug)] //struct example
152 ///struct Person {
153 /// name: String,
154 /// age: i32,
155 ///}
156 ///let mut persons = List::new(); //declare package
157 ///
158 ///persons.add(Person { name: "saeed".to_string(), age: 25 });// set element index=>0
159 ///persons.add(Person { name: "safi".to_string(), age: 26 });// set element index=>1
160 ///
161 ///persons.remove_index(1);// remove element by index
162 ///
163 /// ```
164 pub fn remove_index(&mut self, index: usize) -> Option<T> {
165 let mut current = &mut self.head;
166 for _ in 0..index - 1 {
167 if let Some(ref mut node) = *current {
168 current = &mut node.next;
169 } else {
170 return None;
171 }
172 }
173 current.as_mut().and_then(|node| {
174 node.next.take().map(|next_node| {
175 let next_data = next_node.data;
176 node.next = next_node.next;
177 next_data
178 })
179 })
180 }
181
182 ///this method used for get first element in the list
183 ///
184 ///
185 /// # Examples
186 ///
187 /// ```
188 ///#[derive(Debug)] //struct example
189 ///struct Person {
190 /// name: String,
191 /// age: i32,
192 ///}
193 ///let mut persons = List::new(); //declare package
194 ///
195 ///persons.add(Person { name: "saeed".to_string(), age: 25 });// set element
196 ///persons.add(Person { name: "safi".to_string(), age: 26 });// set element
197 ///
198 ///persons.first();// return first element inthe list
199 ///
200 /// ```
201 pub fn first(&self) -> Option<&T> {
202 self.head.as_ref().map(|node| &node.data)
203 }
204
205 ///this method used for get last element in the list
206 ///
207 ///
208 /// # Examples
209 ///
210 /// ```
211 ///#[derive(Debug)] //struct example
212 ///struct Person {
213 /// name: String,
214 /// age: i32,
215 ///}
216 ///let mut persons = List::new(); //declare package
217 ///
218 ///persons.add(Person { name: "saeed".to_string(), age: 25 });// set element
219 ///persons.add(Person { name: "safi".to_string(), age: 26 });// set element
220 ///
221 ///persons.last();// return last element inthe list
222 ///
223 /// ```
224 pub fn last(&self) -> Option<&T> {
225 let mut current = &self.head;
226 while let Some(ref node) = *current {
227 if node.next.is_none() {
228 return Some(&node.data);
229 }
230 current = &node.next;
231 }
232 None
233 }
234
235 ///this method used for get index of element in the list
236 ///
237 ///# Arguments
238 ///
239 /// * `value` - value type that you gave to list<T:as you passed> .
240 ///
241 ///
242 /// # Examples
243 ///
244 /// ```
245 ///let mut list = List::new(); //declare package
246 ///
247 /// // i32 example
248 ///list.add(1);
249 ///list.add(2);
250 ///list.add(4);
251 ///
252 ///println!("Index of 2: {:?}", list.get_index(&2)); //return 1
253 /// ```
254 pub fn get_index(&self, value: &T) -> Option<usize> where T: PartialEq {
255 let mut current = &self.head;
256 let mut index = 0;
257 while let Some(ref node) = *current {
258 if &node.data == value {
259 return Some(index);
260 }
261 index += 1;
262 current = &node.next;
263 }
264 None
265 }
266
267 ///this method used for get next element in the list
268 ///
269 ///# Arguments
270 ///
271 /// * `value` - value type that you gave to list<T:as you passed> .
272 ///
273 ///
274 /// # Examples
275 ///
276 /// ```
277 ///let mut list = List::new(); //declare package
278 ///
279 /// // i32 example
280 ///list.add(1);
281 ///list.add(2);
282 ///list.add(4);
283 ///
284 /// println!("Next after 2: {:?}", list.next(&2)); //return 4
285 /// ```
286 pub fn next(&self, value: &T) -> Option<&T> where T: PartialEq {
287 let mut current = &self.head;
288 while let Some(ref node) = *current {
289 if &node.data == value {
290 return node.next.as_ref().map(|next_node| &next_node.data);
291 }
292 current = &node.next;
293 }
294 None
295 }
296
297 ///this method used for find ount an element is the last of elemnts in the list or not
298 ///
299 ///# Arguments
300 ///
301 /// * `value` - value type that you gave to list<T:as you passed> .
302 ///
303 ///
304 /// # Examples
305 ///
306 /// ```
307 ///let mut list = List::new(); //declare package
308 ///
309 /// // i32 example
310 ///list.add(1);
311 ///list.add(2);
312 ///list.add(4);
313 ///
314 /// println!("Is 3 last index: {:?}", list.is_last_index(&4)); //return true
315 /// ```
316 pub fn is_last_index(&self, value: &T) -> bool where T: PartialEq {
317 if let Some(index) = self.get_index(value) {
318 let mut current = &self.head;
319 let mut i = 0;
320 while let Some(ref node) = *current {
321 if i == index {
322 return node.next.is_none();
323 }
324 i += 1;
325 current = &node.next;
326 }
327 }
328 false
329 }
330
331 ///return simple rust array
332 pub fn to_array(&self) -> Vec<&T> {
333 let mut array = Vec::new();
334 let mut current = &self.head;
335 while let Some(ref node) = *current {
336 array.push(&node.data);
337 current = &node.next;
338 }
339 array
340 }
341}