前言
本文相当于是本人之前学习数据结构的一个笔记整理,欢迎各位评论指出不足,后续会陆续更新。
目录
一、线性表的定义
学习线性表,首先你得知到什么叫线性表
定义:
注意:
二、线性表的逻辑特征
三、线性表的存储结构之一——顺序存储结构
3.1、顺序表相关概念
顺序存储的定义:
特点:
3.2、顺序表的代码实现(java)
package com.studySelf.Linearlist02.Sqlist;
import java.util.Iterator;
/**
* @author wang
* @packageName com.studySelf.Linearlist02.Sqlist
* @className List
* @date 2021/11/29 19:45
*/
public class Seqlist<T> extends Object implements Iterable<T>{
/**存储元素的数组*/
private Object[] element;
/**记录当前顺序表中元素个数*/
private int n;
//构造方法
public Seqlist(int capacity) {
//初始化数组
this.element = new Object[capacity];
//初始化长度
this.n = 0;
}
/**将一个线性表置为空表*/
public void clear() {
this.n = 0;
}
/**判断当前线性表是否为空表*/
public boolean isEmpty() {
return n==0;
}
/**获取线性表的长度*/
public int length() {
return n;
}
/**获取指定位置的元素*/
public T get(int i) {
return (T) element[i];
}
/**获取所有的元素*/
public void getAll() {
for(int i = 0;i<n;i++) {
System.out.println(element[i]);
}
}
/**向线性表中添加元素*/
public void insert(T t) {
//如果数组已经到达上限,即扩容
if(n==element.length) {
//扩容为原数组的两倍
resize(2*element.length);
}
element[n++] = t;
}
/**在指定i索引处插入元素*/
public void insert(int i,T t) {
//如果数组已经到达上限,即扩容
if(n==element.length) {
//扩容为原数组的两倍
resize(2*element.length);
}
//把索引i处的元素及其后面的元素依次向后移动一位
for(int index = n;index>i;index--) {
element[index] = element[index-1];
}
element[i] = t;
//元素加一
n++;
}
/**删除指定的位置i处的元素,并返回该元素*/
public T remove(int i) {
//记录索引i处的值
T current = (T) element[i];
//索引i后面元素依次向后移动一位即可
for(int index = i;index < n-1 ;index++) {
element[index] = element[index+1];
}
//元素个数-1
n--;
if(n>0 && n<element.length/4) {
resize(element.length/2);
}
return current;
}
/**改变容量的方法*/
public void resize(int newSize) {
//记录原数组
T[] temp = (T[]) element;
//创建新数组
element = new Object[newSize];
//将旧数组的内容传到新数组
for(int i = 0;i<n;i++) {
element[i] = temp[i];
}
}
/**查找t元素第一次出现的位置*/
public int indexOf(T t) {
for(int i =0;i<n;i++) {
if(element[i].equals(t)) {
return i;
}
}
return -1;
}
@Override
public Iterator<T> iterator() {
return new LIterator<T>();
}
private class LIterator<T> implements Iterator<T> {
private int cur ;
public LIterator() {
//从0开始遍历
this.cur = 0;
}
@Override
//该方法表示是否含有下一个元素
public boolean hasNext() {
//当当前元素索引小于元素个数即索引等于或大于n时,证明顺序表中没有元素,返回false
return cur<n;
}
@Override
//下一个元素就是数组中下一个元素
public T next() {
return (T)element[cur++];
}
}
}
测试:
public class SeqListTest {
public static void main(String[] args) {
Seqlist<String> sl = new Seqlist<>(2);
sl.insert("刘翔");
sl.insert("苏炳添");
sl.insert("张三丰");
sl.insert(1,"法拉利");
sl.insert(1,"兰博基尼");
// sl.getAll();
System.out.println("第三位:" +sl.get(2));
for(String s : sl) {
System.out.println(s);
}
}
}
/*
输出结果
第三位:法拉利
刘翔
兰博基尼
法拉利
苏炳添
张三丰
*/
3.3、顺序表的总结
特点:
顺序表的优缺点: