use crate::linear::List;
#[derive(Clone, Debug)]
pub struct SqList<T>
where T:PartialEq+Eq
{
element:[Option<T>;100],
length:usize, }
impl<T> PartialEq for SqList<T> where T: PartialEq + Eq {
fn eq(&self, other: &Self) -> bool {
self.length == other.length &&
self.element.iter().take(self.length).eq(other.element.iter().take(other.length))
}
}
impl<T> List<T> for SqList<T>
where T: Clone + Eq + std::fmt::Debug
{
fn init_list() -> Self {
Self {
element: std::array::from_fn(|_| None),
length: 0,
}
}
fn destroy_list(self) {
drop(self)
}
fn clear_list(&mut self){
for elem in self.element.iter_mut().take(self.length) {
*elem=None;
}
self.length=0;
}
fn list_empty(&self) -> bool {
self.length==0
}
fn list_length(&self) -> usize {
self.length
}
fn get_elem(&self, i: usize) -> Option<T> {
if i == 0 || i > self.length {
return None;
}
self.element[i-1].clone()
}
fn locate_elem(&self, e: T) -> usize {
for (i,element) in self.element.iter().enumerate().take(self.length) {
if let Some(value)=element{
if *value==e{
return i+1;
}
}
}
0
}
fn prior_elem(&self, cur_e: T, _pre_e: &T) ->Option<T> {
for (i,element) in self.element.iter().enumerate().take(self.length) {
if i == 0 {
if let Some(value)=element{
if *value==cur_e{
return None;
}
}
} else {
if let Some(value)=element{
if *value==cur_e{
return self.element[i-1].clone();
}
}
}
}
None
}
fn next_elem(&self, cur_e: T, _next_e: &T) -> Option<T> {
for (i,element) in self.element.iter().enumerate().take(self.length-1) {
if let Some(value)=element{
if *value==cur_e{
return self.element[i+1].clone();
}
}
}
None
}
fn list_insert(&mut self, i: usize, e: T)->Result<(),crate::Err> {
if i == 0 || i > self.length + 1 {
return Err(crate::Err::IndexErr);
}
if self.length >= 100 {
return Err(crate::Err::FullErr);
}
let idx = i - 1;
for j in (idx..self.length).rev() {
self.element[j + 1] = self.element[j].clone();
}
self.element[idx] = Some(e);
self.length += 1;
Ok(())
}
fn list_delete(&mut self, i: usize)->Result<(),crate::Err> {
if i == 0 || i > self.length {
return Err(crate::Err::IndexErr);
}
let idx = i - 1;
if idx == self.length - 1 {
self.element[idx] = None;
} else {
for j in idx..self.length - 1 {
self.element[j] = self.element[j + 1].clone();
}
}
self.element[self.length - 1] = None;
self.length -= 1;
Ok(())
}
fn traverse_list(&self) {
for i in 0..self.length {
if let Some(value) = &self.element[i] {
println!("{:?}", value);
}
}
}
}
pub struct ArrayList<T> {
pub element: [Option<T>; 100],
pub length: usize,
}
impl<T> ArrayList<T>
where
T: Copy + PartialEq + std::fmt::Debug,
{
pub fn new() -> Self {
Self {
element: [None; 100],
length: 0,
}
}
pub fn get_element(&self, index: usize) -> Result<T, &'static str> {
if index == 0 {
return Err("数组越界");
}
let idx = index - 1;
if idx >= self.length {
return Err("数组越界");
};
match self.element[idx] {
Some(value) => Ok(value),
None => Err("元素不存在!"),
}
}
pub fn insert(&mut self, position: usize, element: T) -> Result<(), &'static str> {
if position == 0 || position > self.length + 1 {
return Err("数组越界");
};
let index = position - 1;
if self.length >= 100 {
return Err("数组已满");
};
for i in (index..self.length).rev() {
self.element[i + 1] = self.element[i];
};
self.element[index] = Some(element);
self.length += 1;
Ok(())
}
pub fn locate_index(&self, element: T) -> Result<usize, &'static str> {
for i in 0..self.length {
if let Some(value) = self.element[i] {
if value == element {
return Ok(i + 1);
}
}
}
Err("查找失败")
}
pub fn delete(&mut self, index: usize) -> Result<(), &'static str> {
if index == 0 || index > self.length {
return Err("数组操作越界!");
};
for index in index..self.length {
self.element[index - 1] = self.element[index];
}
self.element[self.length - 1] = None;
self.length -= 1;
Ok(())
}
pub fn clear(&mut self) {
for index in 0..self.length {
self.element[index] = None;
};
self.length = 0;
}
pub fn length(&self) -> usize {
self.length
}
pub fn empty(&self) -> bool {
self.length != 0
}
pub fn prior_element(&self, cur_e: T) -> Result<T, &'static str> {
if self.empty() {
return Err("数组为空");
};
if self.element[0] == Some(cur_e) {
return Err("当前元素为第一个元素,没有前驱");
};
for index in 1..self.length {
if self.element[index] == Some(cur_e) {
return Ok(self.element[index - 1].unwrap());
};
};
Err("元素不存在!")
}
pub fn next_element(&self, cur_e: T) -> Result<T, &'static str> {
if self.empty() {
return Err("数组为空");
}
if self.element[self.length - 1] == Some(cur_e) {
return Err("当前元素为最后一个元素,没有后继");
}
for index in 0..self.length - 1 {
if self.element[index] == Some(cur_e) {
return Ok(self.element[index + 1].unwrap());
}
}
Err("元素不存在!")
}
pub fn traverse(&self) {
for index in 0..self.length {
println!("{:?}", self.element[index].unwrap());
}
}
}