mirror of
https://codeberg.org/JasterV/cool-data-structures.git
synced 2026-04-26 18:40:04 +00:00
linked list in progress
This commit is contained in:
parent
9ea26de7ac
commit
42e1b7e55d
4 changed files with 57 additions and 19 deletions
|
|
@ -1 +1,3 @@
|
|||
pub mod linked_list;
|
||||
mod models;
|
||||
|
||||
pub mod linked_list;
|
||||
|
|
@ -1,30 +1,20 @@
|
|||
use std::rc::Rc;
|
||||
|
||||
enum Node<T> {
|
||||
Header {
|
||||
first: Option<Rc<Node<T>>>,
|
||||
last: Option<Rc<Node<T>>>,
|
||||
},
|
||||
Child {
|
||||
elem: T,
|
||||
next: Rc<Node<T>>,
|
||||
prev: Rc<Node<T>>,
|
||||
},
|
||||
}
|
||||
use std::{cell::RefCell, rc::Rc};
|
||||
use crate::models::linked_list::{Node, SharedNode};
|
||||
|
||||
pub struct DoublyLinkedList<T> {
|
||||
length: u64,
|
||||
root: Node<T>,
|
||||
root: Rc<RefCell<Node<T>>>,
|
||||
}
|
||||
|
||||
impl<T> DoublyLinkedList<T> {
|
||||
pub fn new() -> Self {
|
||||
DoublyLinkedList {
|
||||
length: 0,
|
||||
root: Node::Header {
|
||||
first: None,
|
||||
last: None,
|
||||
},
|
||||
root: Rc::new(RefCell::new(Node::new_head())),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn length(&self) -> u64 {
|
||||
self.length
|
||||
}
|
||||
}
|
||||
|
|
|
|||
45
src/models/linked_list.rs
Normal file
45
src/models/linked_list.rs
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
use std::{cell::RefCell, rc::Rc};
|
||||
|
||||
pub type SharedNode<T> = Rc<RefCell<Option<Node<T>>>>;
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub struct Node<T> {
|
||||
elem: Option<T>,
|
||||
next: SharedNode<T>,
|
||||
prev: SharedNode<T>,
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
impl<T> Node<T> {
|
||||
pub fn new(value: T, next: &SharedNode<T>, prev: &SharedNode<T>) -> Self {
|
||||
Node {
|
||||
elem: Some(value),
|
||||
next: Rc::clone(next),
|
||||
prev: Rc::clone(prev),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn new_head() -> Self {
|
||||
Node {
|
||||
elem: None,
|
||||
next: Rc::new(RefCell::new(None)),
|
||||
prev: Rc::new(RefCell::new(None)),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn elem(&self) -> Option<&T> {
|
||||
self.elem.as_ref()
|
||||
}
|
||||
|
||||
pub fn elem_mut(&mut self) -> Option<&mut T> {
|
||||
self.elem.as_mut()
|
||||
}
|
||||
|
||||
pub fn next(&self) -> SharedNode<T> {
|
||||
Rc::clone(&self.next)
|
||||
}
|
||||
|
||||
pub fn prev(&self) -> SharedNode<T> {
|
||||
Rc::clone(&self.prev)
|
||||
}
|
||||
}
|
||||
1
src/models/mod.rs
Normal file
1
src/models/mod.rs
Normal file
|
|
@ -0,0 +1 @@
|
|||
pub mod linked_list;
|
||||
Loading…
Reference in a new issue