我正在使用Rust实现单链表,但当我试图使用显示方法打印链表的值时,我遇到了问题

ecbunoof  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(90)

我已经实现了rust中的链表程序,下面是Node结构和LnkdList结构。但是当我在LnkdList结构中实现显示方法时,我在current = &node.borrow().next. while循环中得到一个错误,它告诉->临时值在借用时丢失

下面是链表的代码

use std::cell::RefCell;
use std::rc::Rc;

struct Node<T> {
    val: T,
    next: Option<Rc<RefCell<Node<T>>>>,
}

impl<T: std::fmt::Debug> Node<T> {
    fn new(elem: T) -> Rc<RefCell<Self>> {
        Rc::new(RefCell::new(Node {
            val: elem,
            next: None,
        }))
    }
}

pub struct LnkdList<T> {
    head: Option<Rc<RefCell<Node<T>>>>,
    tail: Option<Rc<RefCell<Node<T>>>>,
    size: i32,
}

impl<T: std::fmt::Debug> LnkdList<T> {
    pub fn new() -> Self {
        LnkdList {
            head: None,
            tail: None,
            size: 0,
        }
    }

    pub fn add_front(&mut self, data: T) {
        let new_head = Node::new(data);
        match self.head.take() {
            Some(old_head) => {
                new_head.borrow_mut().next = Some(old_head);
                self.head = Some(new_head);
            }
            node => {
                self.tail = Some(new_head.clone());
                self.head = Some(new_head);
            }
        }
    }

    pub fn add_back(&mut self, data: T) {
        let new_node = Node::new(data);
        match &self.tail {
            Some(node) => {
                node.borrow_mut().next = Some(new_node.clone());
                self.tail = Some(new_node)
            }
            none => {
                self.tail = Some(new_node.clone());
                self.head = Some(new_node);
            }
        }
    }

    pub fn display(&self) {
        let mut current = &self.head;

        while let Some(node) = current {
            println!("{:?}", node.borrow().val);
            current = &node.borrow().next;
        }
    }
}

我已经实现了LnkdList程序如下

fn main() {
    let mut list = lnkd_list::LnkdList::new();

    list.add_front(1);
    list.add_front(23);
    list.display();
}

我希望输出应该是23,1,但显示方法是抛出错误,如上所述

h5qlskok

h5qlskok1#

这个错误的解决方案相当简单。该错误表明您在使用RefCell时不能卸下它的防护。但是因为它是一个Rc,你可以克隆它:

pub fn display(&self) {
    let mut current = self.head.clone();

    while let Some(node) = current {
        println!("{:?}", node.borrow().val);
        current = node.borrow().next.clone();
    }
}

相关问题