首页 > 其他分享 >rust 基础 —— 创建链表

rust 基础 —— 创建链表

时间:2022-11-04 15:01:48浏览次数:47  
标签:Cons Nil 创建 self List 链表 list rust

使用枚举类


use crate::List::{Cons, Nil};

enum List {
    // Cons:元组结构体,包含链表的一个元素和一个指向下一节点的指针
    Cons(u32, Box<List>),
    // Nil:末结点,表明链表结束
    Nil,
}

// 可以为 enum 定义方法
impl List {
    // 创建一个空的 List 实例
    fn new() -> List {
        // `Nil` 为 `List` 类型(译注:因 `Nil` 的完整名称是 `List::Nil`)
        Nil
    }

    // 处理一个 List,在其头部插入新元素,并返回该 List
    fn prepend(self, elem: u32) -> List {
        // `Cons` 同样为 List 类型
        Cons(elem, Box::new(self))
    }

    // 返回 List 的长度
    fn len(&self) -> u32 {
        // 必须对 `self` 进行匹配(match),因为这个方法的行为取决于 `self` 的
        // 取值种类。
        // `self` 为 `&List` 类型,`*self` 为 `List` 类型,匹配一个具体的 `T`
        // 类型要好过匹配引用 `&T`。
        match *self {
            // 不能得到 tail 的所有权,因为 `self` 是借用的;
            // 因此使用一个对 tail 的引用
            Cons(_, ref tail) => 1 + tail.len(),
            // (递归的)基准情形(base case):一个长度为 0 的空列表
            Nil => 0
        }
    }

    // 返回列表的字符串表示(该字符串是堆分配的)
    fn stringify(&self) -> String {
        match *self {
            Cons(head, ref tail) => {
                // `format!` 和 `print!` 类似,但返回的是一个堆分配的字符串,
                // 而不是打印结果到控制台上
                format!("{}, {}", head, tail.stringify())
            },
            Nil => {
                format!("Nil")
            },
        }
    }
}


fn main() {
    // 创建一个空链表
    let mut list = List::new();

    // 追加一些元素
    list = list.prepend(1);
    list = list.prepend(2);
    list = list.prepend(3);

    // 显示链表的最后状态
    println!("linked list has length: {}", list.len());
    println!("{}", list.stringify());
}

标签:Cons,Nil,创建,self,List,链表,list,rust
From: https://www.cnblogs.com/lemos/p/16857774.html

相关文章

  • mysql创建数据库经典题型
     【简答题】有一个XSKC数据库,数据库中包括两个表: 学生表Student由学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、所在院系(Sdept)五个属性组成,记为:Student(Sno,Sn......
  • 包括文件的创建(三种不同方法),文件信息的查询操作,文件夹的创建,Scanner与Ptintln练习
    (一)文件创建的三种不同方法:这是运行成果:(二)文件目录的删除与创建1.文件删除:这是运行成果:2.文件目录的删除:这是运行成果:因为我们在刚刚的文件删除里面把hcb1.tx......
  • leetcode 160. 相交链表 js 实现
    给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。图示两个链表在节点 c1 开始相交: ......
  • 创建swap
    创建swapubuntu20.04中在本地计算机中我们可以使用一个分区格式化为swap,而服务器中硬盘有限,只能创建一个交换文件将其格式话为swap。创建swapfile文件sudofallocate......
  • 手动创建一个Koa项目
    环境安装nodejs环境官网下载:http://nodejs.cn/download/初始化npminit安装模块koakoa中间件  -koa-static(静态资源)  -koa-router(路由)  -ko......
  • 虚拟机创建流程 – libvirt篇
    1.虚拟机创建流程–libvirt篇 1.libvirt的架构1.1.基本架构图1.2.接口调用方式2.从nova到libvirt3.libvirt的接口调用流程4.qemuProcessStart()启......
  • 创建数组,增删改查
    创建数组letarr=[];letarr=newArray(1,2,5);letarr=Array.from([1,2,3],item=>item+2);//[3,4,5]letarr=arr1.concat(arr2,arr3);//返回新数组,concat......
  • idea 创建maven项目
    一.版本相关介绍工具:idea2022.2.2apache-maven-3.8.1注意:文件夹尽量不掺杂中文,空格等特殊字符,使用纯英文方式.二.idea端配置File--Settings--"maven"--.........
  • QT6GUI-工程创建
    ......
  • 关于VCSA-Vcenter-个人账号的创建过程
    最近因需要在vCSA,即vCenterServerAppliance上为同事创建一个账号,于是记录过程如下:1、还是先登录,然后选择左上角【菜单】下的【系统管理】2、然后在SingleSignOn下可......