线性表——顺序表

一,线性表
线性表是最基本,最简单,也是最常用的数据结构。一个线性表是n个具有相同特性的数据元素的数列。
它包含了顺序表,链表,栈,队列,接下来将会一一介绍。

1.1顺序表
顺序表是在计算机内存中以数组形式保存的线性表,通俗点说,即通过数据元素物理上的相邻关系来表示逻辑上的相邻关系。
相关功能的代码如下:
添加元素

//向线性表中添加元素
    public void insert(T t){
        if (N==list.length){
            resize(2*list.length); //将新数组的长度设置为原来的2倍
        }
        list[N++]=t;
    }

向指定位置添加元素

 //向指定位置插入元素
    public void insert(int i,T t){
        //将i后面的元素向后移动一位
        for (int index=N;index>i;index--) {
            list[index] = list[index - 1];
        }
        //将元素插入
        list[i]=t;
        //元素个数加1
        N++;
    }

删除指定位置的元素,并返回其值

//删除指定位置的元素,并返回值
    public T remove(int i){
        //记录索引i处的值
        T current=list[i];
        //将i后的值向前移动一位
        for (int index=i;index<N-1;index++){
            list[index]=list[index+1];
        }
        N--;
        if (N<list.length/4){
            resize(list.length/2);//将新数组的长度设为原来的二分之一
        }
        return current;
    }

查找元素t第一次出现的位置

    //查找元素t第一次出现的位置
    public int search(T t){
        for (int i=0;i<N-1;i++){
            if (list[i].equals(t))
                return i;
        }
        return -1;
    }

在内部遍历元素

//遍历顺序表
    @Override
    public Iterator<T> iterator() {
        return new siterator();
    }
    public class siterator implements Iterator{
        private int cusor;
        public siterator(){
            this.cusor=0;
        }
        @Override
        public boolean hasNext() {
            return cusor<N;
        }

        @Override
        public Object next() {
            return list[cusor++];
        }
    }

顺序表完整代码

public class SequenceList <T> implements Iterable<T>{
    private T[] list;
    private int N;
    public SequenceList(int capacity){
        this.list=(T[])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 list[i];
    }
    //向指定位置插入元素
    public void insert(int i,T t){
        //将i后面的元素向后移动一位
        for (int index=N;index>i;index--) {
            list[index] = list[index - 1];
        }
        //将元素插入
        list[i]=t;
        //元素个数加1
        N++;
    }
    //根据newsize的大小,重置list的大小
    public void resize(int newsize){
        //定义一个临时数组,指向原数组
        T[] arr=list;
        //创建新数组
        list=(T[])new Object[newsize];
        //把原数组中的数据复制到新数组中
        for(int i=0;i<N;i++){
            list[i]=arr[i];
        }

    }
    //向线性表中添加元素
    public void insert(T t){
        if (N==list.length){
            resize(2*list.length); //将新数组的长度设置为原来的2倍
        }
        list[N++]=t;
    }
    //删除指定位置的元素,并返回值
    public T remove(int i){
        //记录索引i处的值
        T current=list[i];
        //将i后的值向前移动一位
        for (int index=i;index<N-1;index++){
            list[index]=list[index+1];
        }
        N--;
        if (N<list.length/4){
            resize(list.length/2);//将新数组的长度设为原来的二分之一
        }
        return current;
    }
    //查找元素t第一次出现的位置
    public int search(T t){
        for (int i=0;i<N-1;i++){
            if (list[i].equals(t))
                return i;
        }
        return -1;
    }
    //遍历顺序表
    @Override
    public Iterator<T> iterator() {
        return new siterator();
    }
    public class siterator implements Iterator{
        private int cusor;
        public siterator(){
            this.cusor=0;
        }
        @Override
        public boolean hasNext() {
            return cusor<N;
        }

        @Override
        public Object next() {
            return list[cusor++];
        }
    }
}

b站详细讲解网址:http://yun.itheima.com/course/639.html

猜你喜欢

转载自blog.csdn.net/love521314123/article/details/107304444