数据结构--线性表

线性表

线性表的逻辑结构

  • 线性表:
线性表是最简单且最常用的一种数据结构,它具备线性结构的特点,并且表中元素属于同一数据对象,元素之间存在一种序偶关系。
  • 线性表的逻辑表示:
线性表可逻辑地表示为(a1,a2,…,ai-1,ai,ai+1,…,an)其中a1为表中的第一个数据元素,an为最后一个数据元素,ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。当i=1,2,…,n-1时,ai有且仅有一个直接后继,当i=2,3,…,n时,ai有且仅有一个直接前驱。
  • 线性表的基本操作
线性表是一种比较灵活的数据结构,可以根据不同的需要对线性表进行多种操作,常见的基本操作有:
(1)初始化——构造一个空的线性表
(2)插入——在线性表的第i个位置之前插入一个新元素
(3)删除——删除线性表中的第i个数据元素
(4)查找——找出线性表中满足特定条件的元素的位置
(5)获取——取线性表中的第i个数据元素
(6)更新——取线性表中的第i个数据元素,检查或更新其中某个数据项的内容
(7)判空——判断当前线性表是否为空
(8)求长度——求出线性表中数据元素的个数
(9)正序遍历——依次访问线性表中每个元素并输出
(10)销毁——销毁一个已存在的线性表
将上述基本操作进行组合,可以实现对线性表的各种更复杂的操作。

顺序表

  • 知识点1:
    在顺序存储结构的线性表中插入或删除一个数据元素,平均约移动表中一半元素,算法add和remove的时间复杂度均为O(n)。

代码实现

  • 顺序表类
package 顺序表;
public class sequenceList<T>{

    final int maxSize = 10; // 顺序表中一维数组的初始长度
    private T[] listArray ; // 保存元素的数组对象
    private int length;     // 保存顺序表的当前长度

    /**
     * 构造方法: 初始化
     */
    public sequenceList(){
        length = 0;         // 将顺序表当前长度设置为0
        listArray = (T[])new Object[maxSize];   // 设置listArray长度为maxSize
    }
    public sequenceList(int n){
        if (n<0){
            System.out.println("error");
            System.exit(1);
        }
        length = 0;
        listArray = (T[]) new Object[n];       // 设置listArray长度为n
    }

    /**
     * 添加一个元素
     * @param obj  添加的元素
     * @param pos  添加的位置
     * @return
     */
    public boolean add(T obj, int pos){ 
        if(pos < 0 || pos >listArray.length){
            System.out.println("pos 不合法");
            return false;
        }
        if(length == listArray.length){     // 顺序表满了,2倍扩容
            T[] p = (T[]) new Object[2*length]; 
            for (int i = 0; i < length ; i++)
                p[i] = listArray[i];
            listArray = p;  
        }
        for (int i = length; i >= pos; i--)
            listArray[i] = listArray[i-1];      // 插入位置后边的数,整体后移
        listArray[pos-1] = obj;
        length ++;
        return  false;
    }

    /**
     * 删除线性表中的某个元素
     * @param pos 删除的位置
     * @return
     */
    public T remove(int pos){
        if( isEmpty()){
            System.out.println("链表为空,无法删除。");
            return null;
        }else{
            if(pos <  1 || pos > length){
                System.out.println("pos 值不合法");
                return null;
            }
            T x = listArray[pos-1];                 // 取出要删除的元素
            for (int i = pos; i <= length ; i++)
                listArray[i-1] = listArray[i];      // 将删除位置后面的元素,前移
            length --;                              // 长度减1
            return  x;
        }

    }

    /**
     * 查找是否存在某个元素
     * @param obj   查找的元素
     * @return
     */
    public int find(T obj){
        if(isEmpty()){
            System.out.println("顺序表为空。");
            return -1;
        }else{
            for (int i = 0; i < length ; i++)
                if(listArray[i].equals(obj))
                    return  i+1;
            return -1;
        }
    }

    /**
     * 从线性表中获取一个元素,并返回
     * @param pos
     * @return
     */
    public T value(int pos){
        if(isEmpty()){
            System.out.println("顺序表为空。");
            return null;
        }else{
            if(pos < 1 || pos > length){
                System.out.println("pos 值不合法");
                return null;
            }
            return listArray[pos-1];
        }
    }

    /**
     * 更新线性表中某个元素
     * @param obj 更新的值
     * @param pos 更新的位置
     * @return
     */
    public boolean modify(T obj, int pos){
        if(isEmpty()){
            System.out.println("顺序表为空。");
            return  false;
        }else{
            if(pos < 1 || pos > length){
                System.out.println("pos 值非法。");
                return false;
            }
            listArray[pos-1] = obj;
            return  true;
        }
    }

    /**
     * 判断线性表是否为空
     * @return
     */
    public boolean isEmpty(){
        return length == 0;
    }

    /**
     * 求线性中元素的个数
     * @return
     */
    public int size(){
        return  length;
    }

    /**
     * 按序访问线性表中的元素,并输出
     */
    public void listByOrder(){
        for (int i = 0; i < length ; i++)
            System.out.println(listArray[i]);
    }

    /**
     * 清空线性表中的元素
     */
    public void clear(){
        length = 0;
    }
}

  • 测试
package 顺序表;

public class Test {
    public static void main(String[] args) {
        sequenceList<Integer> seqList = new sequenceList<Integer>();
         seqList.add(11,1);
         seqList.add(23,2);
         seqList.add(35,3);
         seqList.add(22,4);
         seqList.add(34,5);
         seqList.listByOrder();
         System.out.println("元素23的位置: "+ seqList.find(23));
         System.out.println("顺序表第3个位置的元素: "+  seqList.value(3));
         System.out.println("移除元素35: " + seqList.remove(34));
    }
}
  • 运行结果

链表

posted @ 2020-11-09 23:56  sinlearn  阅读(253)  评论(0编辑  收藏  举报