Compare commits
10 commits
95998d4a95
...
534b0d39e0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
534b0d39e0 | ||
|
|
0cf2b5c247 | ||
|
|
beb5272b61 | ||
|
|
eca0964be5 | ||
|
|
71587e810c | ||
|
|
b892e70bb5 | ||
|
|
45389910ac | ||
|
|
4319534b6b | ||
|
|
06ce6d7cc3 | ||
|
|
ae2d94d6f8 |
2 changed files with 39 additions and 16 deletions
1
README.md
Normal file
1
README.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
simple implementation of linkedlist for rust workshop, with tags on every commit
|
||||
54
src/main.rs
54
src/main.rs
|
|
@ -1,34 +1,56 @@
|
|||
fn main() {}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct List {
|
||||
head: Link,
|
||||
fn main() {
|
||||
let mut list = List::new();
|
||||
list.push(1);
|
||||
println!("push(1) : {:?}", list);
|
||||
list.push(2);
|
||||
println!("push(2) : {:?}", list);
|
||||
println!("pop() -> {} : {:?}", list.pop().unwrap(), list);
|
||||
println!("pop() -> {} : {:?}", list.pop().unwrap(), list);
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
enum Link {
|
||||
Empty,
|
||||
More(Box<Node>),
|
||||
pub struct List<T> {
|
||||
head: Link<T>,
|
||||
}
|
||||
|
||||
type Link<T> = Option<Box<Node<T>>>;
|
||||
|
||||
#[derive(Debug)]
|
||||
struct Node {
|
||||
elem: i32,
|
||||
next: Link,
|
||||
struct Node<T> {
|
||||
elem: T,
|
||||
next: Link<T>,
|
||||
}
|
||||
|
||||
impl List {
|
||||
impl<T> List<T> {
|
||||
pub fn new() -> Self {
|
||||
Self { head: Link::Empty }
|
||||
Self { head: None }
|
||||
}
|
||||
|
||||
pub fn push(&mut self, elem: i32) {
|
||||
pub fn push(&mut self, elem: T) {
|
||||
let new_node = Node {
|
||||
elem: elem,
|
||||
next: std::mem::replace(&mut self.head, Link::Empty),
|
||||
next: self.head.take(),
|
||||
};
|
||||
self.head = Link::More(Box::new(new_node));
|
||||
self.head = Some(Box::new(new_node));
|
||||
}
|
||||
|
||||
pub fn pop(&mut self) -> Option<T> {
|
||||
self.head.take().map(|node| {
|
||||
self.head = node.next;
|
||||
node.elem
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test() {
|
||||
let mut list = List::new();
|
||||
list.push(42);
|
||||
assert_eq!(Some(42), list.pop());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue