Решение на упр.08 задача 1 от Божидар Виденов
Към профила на Божидар Виденов
Код
use std::rc::Rc;
struct List<T> {
head: Link<T>,
}
type Link<T> = Option<Rc<Node<T>>>;
struct Node<T> {
elem: T,
next: Link<T>,
}
impl<T> List<T> {
fn new() -> Self {
List { head: None }
}
fn head(&self) -> Option<&T> {
match &self.head {
None => None,
Some(link) => Some(&link.elem),
}
}
fn tail(&self) -> List<T> {
match &self.head {
Some(head) => List {
head: head.next.clone(),
},
None => List { head: None },
}
}
fn prepend(&self, value: T) -> List<T> {
let new_head: Link<T> = Some(Rc::new(Node {
elem: value,
next: self.head.clone(),
}));
List { head: new_head }
}
fn iter(&self) -> Iter<'_, T> {
Iter {
curr_el: &self.head,
}
}
}
struct Iter<'a, T> {
curr_el: &'a Link<T>,
}
impl<'a, T> Iterator for Iter<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
match self.curr_el {
None => None,
Some(node) => {
self.curr_el = &node.next;
Some(&node.elem)
}
}
}
}
