使用Rust编写Linktable库

m0_63334846 2022-04-06 21:50:27
//定义节点
#[derive(Debug)]
struct Node<T> {
	elem: T,
	next: Link<T>,
}
//定义链表
#[derive(Debug)]
struct LinkedList<T> {
	head: Link<T>,
	tail: Link<T>,
}

type Link<T> = Option<Rc<RefCell<Node<T>>>>;

相关API设计

//链表的初始化,初始化一个空的链表
impl<T> LinkedList<T> {
  fn new() -> Self {
    LinkedList {
      head: None,
      tail: None,
    }
  }
}

//向链表中添加新的节点
fn push(&mut self, elem: T) {
  let new_point = Rc::new(Node {
    elem,
    next: self.head.take()
  });
  // self.head = Some(new_point);
  if self.tail.is_none() {
    self.tail = Some(Rc::clone(&new_point));
    // self.tail = self.head.as_ref().map(|s| Rc::clone(s))
  }
  self.head = Some(new_point);
}


//删除节点
type Link<T> = Option<Rc<RefCell<Node<T>>>>;

fn pop_link(&mut self) -> Link<T> {
  let first_link = self.head.take();
  let next_link = match first_link {
    Some(ref x) => x.borrow_mut().next.take(),
    None => None
  };
  self.head = next_link;
  if self.head.is_none() {
    self.tail.take();
  }
  first_link
}

//查看链表中头结点内容
fn peek_mut(&mut self) -> Option<RefMut<T>> {
  self.head.as_ref().map(|r| RefMut::map(
      r.borrow_mut(), |node| &mut node.elem
  ))
}

//对链表的遍历,使用Iterator
pub trait Iterator {
    type Item;
    fn next(&mut self) -> Option<Self::Item>;
}

struct IntoIter<T>(LinkedList<T>);

impl<T> Iterator for IntoIter<T> {
  type Item = T;
  fn next(&mut self) -> Option<Self::Item> {
    self.0.pop()
  }
}

测试代码

fn main() {
	let mut list: LinkedList<u32> = LinkedList::new();
	list.push(1);
	list.push(2);
	list.push(3);
	list.push(4);

	*list.peek_mut().unwrap() = 5;
	println!("peek: {:?}\n", list.peek().unwrap());

	println!("pop: {:?}\n", list.pop());

	let mut iter = list.into_iter();
	println!("next: {:?}\n", iter.next());
	println!("next: {:?}\n", iter.next());
	println!("next: {:?}\n", iter.next());
	println!("next: {:?}\n", iter.next());
}

测试结果:

将代码push至Gitee

库链接:https://gitee.com/liu-xuanliang1/trust-build-linktable

 

学号:323 

 

 

...全文
107 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-数据结构与算法 发布问题, 以便更快地解决您的疑问

571

社区成员

发帖
与我相关
我的任务
社区描述
软件工程教学新范式,强化专项技能训练+基于项目的学习PBL。Git仓库:https://gitee.com/mengning997/se
软件工程 高校
社区管理员
  • 码农孟宁
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧