2017-01-14 15 views
0

最近私は自分自身でRustを教えようとしていましたが、単純なリンクリストを実装して少し練習したかったのです。私はRustライブラリのリンクリストからインスピレーションを受けて、すでに理解している部分を再現しようとしました。また、私はそれを今のところひとつにすることにしました。Rustの単独リンクリスト

struct Node<T> { 
    element: T, 
    next: Option<Box<Node<T>>>, 
} 

impl<T> Node<T> { 
    fn new(element: T) -> Self { 
     Node { 
      element: element, 
      next: None, 
     } 
    } 

    fn append(&mut self, element: Box<Node<T>>) { 
     self.next = Some(element); 
    } 
} 

pub struct LinkedList<T> { 
    head: Option<Box<Node<T>>>, 
    tail: Option<Box<Node<T>>>, 
    len: u32, 
} 

impl<T> LinkedList<T> { 
    pub fn new() -> Self { 
     head: None, 
     tail: None, 
     len: 0, 
    } 

    pub fn push(&mut self, element: T) { 
     let node: Box<Node<T>> = Box::new(Node::new(element)); 

     match self.tail { 
      None => self.head = Some(node), 
      Some(mut ref tail) => tail.append(node), 
     } 
     self.tail = Some(node); 
     self.len += 1; 
    } 

    pub fn pop(&mut self) -> Option<T> { 
     //not implemented 
    } 

    pub fn get(&self, index: u32) -> Option<T> { 
     //not implemented 
    } 
} 

これは私がこれまでに得たものです。私が理解しているところでは、このコードの問題は、Boxがメモリの安全性を保持するために複数のリファレンスを持つことができないということです。私は

None => self.head = Some(node), 

にノードへのリストの先頭に設定したときに

だから私は、その後

self.tail = Some(node); 

後に先に行くと、設定することはできません、私は私の理解では、これまでに修正するのですか?これを行う正しい方法は何でしょうか?ライブラリのようにSharedを使用する必要がありますか、またはBoxまたは他のタイプを利用できる方法はありますか?

+7

[必須基準(全面が多すぎリンクリストで錆を学習)](http://cglab.ca/~abeinges/blah/too-many-lists/book/) – ljedrz

+1

なお伝統的なシングルl inked(Consリスト)は 'tail'を記憶しません。これはO(1)で追加できるようにする方法ですが、必ずしも必要ではありません。 –

答えて

0

あなたの問題は、移動後に値(node)を使用しようとしていることです。 Box<Node<T>>Copyを実装していないので、あなたがmatch表現で使用するとき、:

match self.tail { 
    None => self.head = Some(node), 
    Some(ref mut tail) => tail.append(node), 
} 

nodeself.headまたはself.tailのいずれかに移動されていない、もはや後に使用することができます。あなたはルーストにリンクリストを実装することが可能なさまざまな方法を見ることが義務Learning Rust With Entirely Too Many Linked Listsを読ん以外に、私はあなたが最初特に、錆の基本的な概念の分野でいくつかのより多くの研究を行うことを示唆している:

関連する問題