• 2.2_线性表的顺序存储结构_参考集合ArrayList


    【线性表的顺序存储从结构】

    指的是用一段连续的存储单元一次储存线性表的数据元素。

    【线性表的顺序存储的结构代码 C语言版】

    #define MAXSIZE 20               /*存储空间初始分配量*/
    typedef int  ElemType;           /*ElemType类型依实际情况而定*/
    typedef struct
    {
        Element data[MAXSIZE];       /*数组存储数据元素,最大值为MAXSIZE*/
        int length;                  /*线性表当前长度为length*/
    }SqlList;

    【线性表的顺序存储结构需要的三个属性】

    1.存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置。

    2.线性表的最大存储容量:数组长度MaxSize

    3.线性表的当前长度:length

    【数组长度和线性表长度的区别】

    数组的长度:存放线性表的存储空间的长度,存储分配后这个量一般是不变的。

    线性表的长度:线性表中的数据元素的个数,随着线性表插入和删除操作的进行,这个量是变化的。

    当然,任意时候线性表的长度是小于数组的长度的。

    【地址的计算方法】

    存储器中的每个存储单元都有自己的编号,这个编号称为地址。

     由于每个数据元素,不管是什么类型,都需要占用一定的存储空间的,假设占用的是c个存储单元,那么线性表中第i+1个数据元US的存储位置和第i个数据元素的存储位置满足下列关系:(LOC表示获得存储位置的函数)

    对于第i个数据元素ai的存储位置可以由a1推算出来:

    【java描述顺序线性表

    【整体工程截图】

    【线性顺序表抽象数据类型 JAVA接口 描述】

    package com.Higgin.List;
    
    public interface MyList<E> {
        int size();                       //返回线性表中的元素数量
        boolean isEmpty();              //判断线性表是否为空
        void clear();                      //将线性表清空
        E get(int index);                //返回线性表的第index个元素
        int indexOf(Object o);             //在线性表中查找与给定元素o相等的元素,查找成功,则返回对应的序号;否则,返回-1表示失败
        boolean add(E e);               //向线性表的尾部添加指定的元素e
        void add(int index,E element);  //向线性表的指定位置第index处添加指定的元素
        E remove(int index);            //移除线性表的第index处的元素,返回删除的元素的值
    }

    【具体的实现类】

    package com.Higgin.List;
    
    public class MyArrayList<E> implements MyList{
        private int size;
        private Object[] elementData;
        
        /**
         * 构造一个容量为initialCapacity的空顺序线性表
         */
        public MyArrayList(int initialCapacity){
            if (initialCapacity < 0)
                throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
            this.elementData=new Object[initialCapacity];
        }
        
        /**
         * 返回线性表中的元素数量
         */
        public int size() {
            return size;
        }
        
        /**
         * 判断线性表是否为空
         */
        public boolean isEmpty() {
            return size==0;
        }
        
        /**
         * 将线性表清空
         */
        public void clear() {
            for(int i=0;i<size;i++){ //所有元素置为null
                elementData[i]=null;
            }
            size=0; //线性表长度置为0
        }
        
        /**
         * 返回线性表的第index个元素
         */
        public Object get(int index) {
            if(index<0||index>=this.size){
                 throw new IndexOutOfBoundsException("Index: "+index+", Size: "+this.size);
            }
            return elementData[index];
        }
        /**
         * 在线性表中查找与给定元素o相等的元素,查找成功,则返回对应的序号;否则,返回-1表示失败
         */
        public int indexOf(Object o) {
            if(o==null){
                for(int i=0;i<size;i++){
                    if(elementData[i]==null){
                        return i;
                    }
                }
            }else{
                for(int i=0;i<size;i++){
                    if(o.equals(elementData[i])){
                        return i;
                    }
                }
            }
            return -1;
        }
        /**
         * 向线性表的尾部添加指定的元素e
         */
        public boolean add(Object e) {
            add(size,e);
            return true;
        }
        /**
         * 向线性表的指定位置第index处添加指定的元素
         */
        public void add(int index, Object element) {
            if (index > size || index < 0) //当index不在范围内
                throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size);
            if(index<size){ //若插入的位置不在表尾
                for(int i=size;i>=index;i--){
                    elementData[i+1]=elementData[i];
                }
            }
            elementData[index]=element;
            size++;
        }
        /**
         * 移除线性表的第index处的元素,返回删除的元素
         */
        public E remove(int index) {
            if(size==0){                  //如果此时线性表为空
                 throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size);
            }
            if (index >= size||index<0)   //如果移除的位置超出范围
                throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size);
            E oldValue=(E) elementData[index]; //存储被删除的值
            if(index<size-1){              //如果删除的位置不是最后的位置
                for(int i=index;i<size;i++){
                    elementData[i]=elementData[i+1];
                }
            }
            elementData[size] = null;  //表尾元素置为null
            size--;  
            return oldValue;
        }
    }

     【思路:关于 插入】

    1.如果插入的位置不合理,抛出异常。

    2.如果线性表长度大于等于数组的长度,抛出异常或动态增加容量。

    3.从最后一个元素开始向前遍历到底index个位置,分别将他们向后移动1个位置(包括index位置)。

    4.将要插入的元素填入位置index处。

    5.表长size要加1。

    【思路:关于删除】

     1.如果表长度为0或删除的位置不合理,抛出异常。

    2.取出要删除的元素。

    3.从删除的元素的位置index处开始遍历到最后一个元素,分别将他们向前移动一个位置。

    4.原先最后一个元素的位置要置为null。

    5.表长size要减1。

    【分析:线性表顺序存储结构的优缺点】

    【优点】

    1.无需为表中的元素之间的逻辑关系增加额外的存储空间(相对于链表)。

    2.可以快速的取出表中任意位置的元素。

    【缺点】

    1.插入和删除操纵需要移动大量的元素,时间复杂度O(n)

    2.当线性表长度变化较大时,难以确定存储空间的容量。

    3.会造成存储空间“碎片”。

  • 相关阅读:
    Mongodb 的ORM框架 Morphia之注解
    Redis主从集群及哨兵模式
    Dubbo
    Zookeeper
    使用Dockerfile自定义一个包含centos,tomcat的镜像
    linux/centOS 下安装 ngnix
    Session共享
    Linux安装jdk.18和tomcat8
    MongoDB集群的搭建
    多态--方法重写的三个要点
  • 原文地址:https://www.cnblogs.com/HigginCui/p/6084898.html
Copyright © 2020-2023  润新知