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で動作する必要があります)ありこのリストを通して?
実際にはかなり大きくなる可能性があるため、再帰を使用したくないので、スタックをオーバーフローさせたくありません。