嵌入式技术论坛
直播中

laisvl

8年用户 1063经验值
私信 关注
[经验]

如何去实现一种基于Rust的单向链表设计呢

利用结构体 (struct) 定义成员变量
num 表示当前结点值,next 指向下一个结点的指针。


#[derive(Debug)]
pub struct List {
    pub num: i32,
    pub next: Option>,
}
利用 impl 关键字来定义结构体成员方法
impl List {
}
创建链表
pub fn new(value: i32) -> List {
    List {
        next: None,
        num: value
    }
}
添加结点
pub fn append(&mut self, value: i32) {
    let _node = List::new(value);
    self.get_last_node().next = Some(Box::new(_node));
}
计算链表长度
pub fn len(&self) -> u32 {
    match &self.next {
        Some(list) => list.len() + 1,
        None => 0,
    }
}
找到最后一个结点
pub fn get_last_node(&mut self) -> &mut Self {
    if let Some(ref mut node) = self.next {
        node.get_last_node()
    }
    else {
        return self;
    }
}
遍历链表
pub fn traverse(&self) {
    let mut node_num = 0;
    let mut curr = self.next.as_ref();
    while curr.is_some() {
        print!("node{}: {:?}n", node_num, curr);
        curr = curr.unwrap().next.as_ref();
        node_num += 1;
    }
}
删除结点值为 value 的结点
pub fn delete_node(head: Option>, value: i32) -> Option> {
    let mut head = head;
    let mut curr = head.as_mut();
    while curr.is_some() && curr.as_ref().unwrap().next.is_some() {
        if curr.as_ref().unwrap().next.as_ref().unwrap().num == value {
            let next = curr.as_mut().unwrap().next.as_mut().unwrap().next.take();
            curr.as_mut().unwrap().next = next;
        }
        else {
            curr = curr.unwrap().next.as_mut();
        }
    }
    return head;
}
测试代码
#[derive(Debug)]
pub struct List {
    pub num: i32,
    pub next: Option>,
}



原作者:Papalymo

更多回帖

发帖
×
20
完善资料,
赚取积分