Created
April 1, 2017 05:23
-
-
Save nidev/4af0cdfeb706ea89a3d116332a351890 to your computer and use it in GitHub Desktop.
It loops!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use std::mem; | |
use std::ptr; | |
type Link<T> = *mut DoubleLinkNode<T>; | |
struct DoubleLinkNode<T> { | |
prev: Link<T>, | |
next: Link<T>, | |
value: T | |
} | |
impl<T> DoubleLinkNode<T> where T: std::fmt::Debug { | |
fn push_back(&mut self, value: T) { | |
let mut juggling: Link<T> = self as *mut Self; | |
loop { | |
unsafe { | |
if (*juggling).next.is_null() { | |
println!("found null, stop loop."); | |
break; | |
} | |
else { | |
let tmp_ptr: Link<T> = (*juggling).next; | |
println!("found not-null. move to next <- {:?}", (*tmp_ptr).value); | |
juggling = (*juggling).next; | |
} | |
} | |
} | |
unsafe { | |
println!("assign <- {:?}", value); | |
(*juggling).next = &mut DoubleLinkNode { prev: juggling as *mut DoubleLinkNode<T>, next:ptr::null_mut::<DoubleLinkNode<T>>(), value:value } as *mut DoubleLinkNode<T>; | |
} | |
} | |
} | |
fn main() { | |
let mut l1: DoubleLinkNode<i32> = DoubleLinkNode { prev: ptr::null_mut::<DoubleLinkNode<i32>>(), next: ptr::null_mut::<DoubleLinkNode<i32>>(), value:1 }; | |
l1.push_back(2); | |
l1.push_back(3); | |
l1.push_back(4); | |
l1.push_back(5); | |
println!("{}", l1.value); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment