LinkedTable-rust

f_z_nj 2022-04-09 12:11:27

结构体定义

#[derive(Debug)]
struct LinkedList<T> {
	head: Link<T>,
	tail: Link<T>,
}

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

#[derive(Debug)]
struct Node<T> {
	elem: T,
	next: Link<T>,
}

实例

fn new() -> Self {
    LinkedList {
        head: None,
        tail: None,
    }
}

迭代器

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 into_iter(self) -> IntoIter<T> {
    IntoIter(self)
}

后插

	fn push(&mut self, elem: T) {
		let new_point = Rc::new(RefCell::new(Node {
			elem,
			next: self.head.take()
		}));
		if self.tail.is_none() {
			self.tail = Some(Rc::clone(&new_point));
		}
		self.head = Some(new_point);
	}

头结点



	fn peek_node(&self) -> Option<Ref<Node<T>>> {
		self.head.as_ref().map(|r| r.borrow())
	}

	fn peek(&self) -> Option<Ref<T>> {
		self.head.as_ref().map(|r| Ref::map(
			r.borrow(), |node| &node.elem
		))
	}

弹出

	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 pop(&mut self) -> Option<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.map(|r| Rc::try_unwrap(r).ok().unwrap().into_inner().elem)
	}

学号:166

链接:FCoder2021/LinkedTable-rust (github.com)

...全文
137 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

571

社区成员

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

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