2016-03-29 7 views
1

再帰を使わない単純なループを書いて、Rustリスト(最初のノードはセンチネル)をトラバースし、 ) それから。標準ライブラリを使用していないときにリストから繰り返し検索して削除する方法

私は成功し、独自に取り組んでいますremove_first関数を記述するために管理してきましたが、リストを反復処理しようとすると、私に借りチェッカーの問題の原因となっている。

// This code is placed in the public domain 
struct Node<'a> { 
    val : i32, 
    next : Option<&'a mut Node<'a> >, 
} 
struct List<'a> { 
    glob : Option<&'a mut Node<'a> >, 
} 


struct AllocatedList<'a> { 
    el0 : Node<'a>, 
    el1 : Node<'a>, 
    el2 : Node<'a>, 
    el3 : Node<'a>, 
    el4 : Node<'a>, 
    el5 : Node<'a>, 
    el6 : Node<'a>, 
    sentinel : Node<'a>, 
    list : List<'a>, 
} 
    fn remove_cur<'a>(mut iter : &mut Option<&mut Node<'a> >) -> &'a mut Node<'a> { 
     match *iter { 
     Some(ref mut glob_next) => { 
      let rest : Option<&'a mut Node <'a> >; 
      match glob_next.next { 
       Some(ref mut root_cell) => { 
        rest = std::mem::replace(&mut root_cell.next, None); 
       }, 
       None => rest = None, 
      } 
      match std::mem::replace(&mut glob_next.next, rest) { 
       Some(mut root_cell) => 
       { 
        return root_cell; 
       }, 
       None => panic!("Empty list"), 
      } 
     }, 
     None => panic!("List not initialized"), 
    } 
    } 

impl<'a> List<'a> { 
    fn remove_first(self : &mut List<'a>) -> &'a mut Node<'a> { 
     return remove_cur(&mut self.glob); 
    } 

    fn remove_search(self : &mut List<'a>, searched:i32) -> &'a mut Node<'a> { 
     let mut list_iter : &mut Option<&'a mut Node<'a> > = &mut self.glob; 
     loop { 
      match *list_iter { 
       Some(ref mut cur_cell) => { 
       match cur_cell.next { 
        Some(ref item) => { 
         if cur_cell.val == searched { 
          break; 
         } 
        }, 
        None=>{}, 
        } 
        list_iter = &mut cur_cell.next; 
       }, 
       None => { // use whatever is available if nothing matches well 
        panic!("Not found"); 
       }, 
     } 
    } 
    return remove_cur(list_iter); 
} 
} 

fn main() { 
    let mut a : AllocatedList = AllocatedList{ 
     el0 : Node{val : 0, next : None}, 
     el1 : Node{val : 1, next : None}, 
     el2 : Node{val : 2, next : None}, 
     el3 : Node{val : 3, next : None}, 
     el4 : Node{val : 4, next : None}, 
     el5 : Node{val : 5, next : None}, 
     el6 : Node{val : 6, next : None}, 
     sentinel : Node {val : -1, next : None}, 
     list : List{glob:None}, 
    }; 
    a.el5.next = Some(&mut a.el6); 
    a.el4.next = Some(&mut a.el5); 
    a.el3.next = Some(&mut a.el4); 
    a.el2.next = Some(&mut a.el3); 
    a.el1.next = Some(&mut a.el2); 
    a.el0.next = Some(&mut a.el1); 
    a.sentinel.next = Some(&mut a.el0); 
    a.list.glob = Some(&mut a.sentinel); 
    let removed_el = a.list.remove_first(); 
    println!("Removed {:?}", removed_el.val); 
    let removed_el = a.list.remove_first(); 
    println!("Removed {:?}", removed_el.val); 

    let removed_x = a.list.remove_search(5); 
    println!("Removed {:?}", removed_x.val); 
} 
:ここ

は、プログラムの

エラーがある:

52:36 error: cannot borrow `list_iter.0` as mutable more than once at a time [E0499] 
      Some(ref mut cur_cell) => { 
       ^~~~~~~~~~~~~~~~ 
69:3 note: previous borrow ends here 
    fn remove_search(self : &mut List<'a>, searched:i32) -> &'a mut Node<'a> { 

61:49 error: cannot assign to `list_iter` because it is borrowed [E0506] 
       list_iter = &mut cur_cell.next; 
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
52:36 note: borrow of `list_iter` occurs here 
      Some(ref mut cur_cell) => { 
        ^~~~~~~~~~~~~~~~ 

は、私は従うことができます任意のレシピや、私は私のコードで行うことができます任意の変更は、反復する(nostdlibで動作する必要があります)ありこのリストを通して?

実際にはかなり大きくなる可能性があるため、再帰を使用したくないので、スタックをオーバーフローさせたくありません。

答えて

0

他の人のためにここに貼り付けられた再帰的なバージョンがありますが、誰かがそれを反復的に変換する手助けをすることができます:可能であれば、スタックサイズに制限されません。

// This code is placed in the public domain 
struct Node<'a> { 
    val : i32, 
    next : Option<&'a mut Node<'a> >, 
} 
struct List<'a> { 
    glob : Option<&'a mut Node<'a> >, 
} 


struct AllocatedList<'a> { 
    el0 : Node<'a>, 
    el1 : Node<'a>, 
    el2 : Node<'a>, 
    el3 : Node<'a>, 
    el4 : Node<'a>, 
    el5 : Node<'a>, 
    el6 : Node<'a>, 
    el7 : Node<'a>, 
    sentinel : Node<'a>, 
    list : List<'a>, 
} 
    fn remove_cur<'a>(mut iter : &mut Option<&mut Node<'a> >) -> &'a mut Node<'a> { 
     match *iter { 
     Some(ref mut glob_next) => { 
      let rest : Option<&'a mut Node <'a> >; 
      match glob_next.next { 
       Some(ref mut root_cell) => { 
        rest = std::mem::replace(&mut root_cell.next, None); 
       }, 
       None => rest = None, 
      } 
      match std::mem::replace(&mut glob_next.next, rest) { 
       Some(mut root_cell) => 
       { 
        return root_cell; 
       }, 
       None => panic!("Empty list"), 
      } 
     }, 
     None => panic!("List not initialized"), 
    } 
    } 

    fn remove_search_recursive<'a> (mut node : &mut Option<&mut Node <'a> >, searched:i32) -> &'a mut Node<'a> { 
    let mut found : bool = false; 
    { 
     match *node { 
      Some(ref mut cur_cell) => { 
       match cur_cell.next { 
        Some(ref item) => { 
         if item.val == searched { 
           found = true; 
         } 
        }, 
        None => panic!("Not found"), 
       } 
       if !found { 
        return remove_search_recursive(&mut cur_cell.next, searched); 
       } 
      }, 
      None => panic!("Not impl"), 
     } 
    } 
    if found { 
     return remove_cur(node); 
    } 
    panic!("Not impl"); 
} 

impl<'a> List<'a> { 
    fn remove_first(self : &mut List<'a>) -> &'a mut Node<'a> { 
     return remove_cur(&mut self.glob); 
    } 
    fn remove_search_recursive(self : &mut List<'a>, searched:i32) -> &'a mut Node<'a> { 
    return remove_search_recursive(&mut self.glob, searched); 
    } 
} 
fn main() { 
    let mut a : AllocatedList = AllocatedList{ 
     el0 : Node{val : 0, next : None}, 
     el1 : Node{val : 1, next : None}, 
     el2 : Node{val : 2, next : None}, 
     el3 : Node{val : 3, next : None}, 
     el4 : Node{val : 4, next : None}, 
     el5 : Node{val : 5, next : None}, 
     el6 : Node{val : 6, next : None}, 
     el7 : Node{val : 7, next : None}, 
     sentinel : Node {val : -1, next : None}, 
     list : List{glob:None}, 
    }; 
    a.el6.next = Some(&mut a.el7); 
    a.el5.next = Some(&mut a.el6); 
    a.el4.next = Some(&mut a.el5); 
    a.el3.next = Some(&mut a.el4); 
    a.el2.next = Some(&mut a.el3); 
    a.el1.next = Some(&mut a.el2); 
    a.el0.next = Some(&mut a.el1); 
    a.sentinel.next = Some(&mut a.el0); 
    a.list.glob = Some(&mut a.sentinel); 
    let removed_el = a.list.remove_first(); 
    println!("Removed {:?}", removed_el.val); 
    let removed_el = a.list.remove_first(); 
    println!("Removed {:?}", removed_el.val); 

    let removed_x = a.list.remove_search_recursive(5); 
    println!("Removed {:?}", removed_x.val); 
    let removed_y = a.list.remove_search_recursive(3); 
    println!("Removed {:?}", removed_y.val); 
} 
関連する問題