Doubly-linked list/Element insertion: Difference between revisions

Content added Content deleted
Line 949: Line 949:
head = DListNode.from_array([:a, :b])
head = DListNode.from_array([:a, :b])
head.insert_after(:a, :c)</lang>
head.insert_after(:a, :c)</lang>

=={{header|Rust}}==
This expands upon the implementation defined in [[Doubly-linked list/Element definition#Rust]] and consists of the relevant lines from the LinkedList implementation in the Rust standard library.

<lang rust>struct Node<T> {
next: Link<T>,
prev: Rawlink<Node<T>>,
value: T,
}

impl<T> Node<T> {
fn new(v: T) -> Node<T> {
Node {value: v, next: None, prev: Rawlink::none()}
}
}

impl<T> Rawlink<T> {
fn none() -> Self {
Rawlink {p: ptr::null_mut()}
}

fn some(n: &mut T) -> Rawlink<T> {
Rawlink{p: n}
}
}

impl<'a, T> From<&'a mut Link<T>> for Rawlink<Node<T>> {
fn from(node: &'a mut Link<T>) -> Self {
match node.as_mut() {
None => Rawlink::none(),
Some(ptr) => Rawlink::some(ptr)
}
}
}


fn link_no_prev<T>(mut next: Box<Node<T>>) -> Link<T> {
next.prev = Rawlink::none();
Some(next)
}

impl<T> LinkedList<T> {
#[inline]
fn push_front_node(&mut self, mut new_head: Box<Node<T>>) {
match self.list_head {
None => {
self.list_head = link_no_prev(new_head);
self.list_tail = Rawlink::from(&mut self.list_head);
}
Some(ref mut head) => {
new_head.prev = Rawlink::none();
head.prev = Rawlink::some(&mut *new_head);
mem::swap(head, &mut new_head);
head.next = Some(new_head);
}
}
self.length += 1;
}
pub fn push_front(&mut self, elt: T) {
self.push_front_node(Box::new(Node::new(elt)));
}
}</lang>


=={{header|Tcl}}==
=={{header|Tcl}}==