zoukankan      html  css  js  c++  java
  • 数据结构--线性表

    线性表

    线性表的逻辑结构

    • 线性表:
    线性表是最简单且最常用的一种数据结构,它具备线性结构的特点,并且表中元素属于同一数据对象,元素之间存在一种序偶关系。
    
    • 线性表的逻辑表示:
    线性表可逻辑地表示为(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));
        }
    }
    
    • 运行结果

    链表

  • 相关阅读:
    vue中v-slot使用
    Angular服务
    Angular的使用
    Angular介绍
    缓存组件
    mvvm和mvc的区别
    vue项目优化
    windows环境安装和使用curl与ES交互
    Java自定义注解
    ajax异步请求后台数据处理
  • 原文地址:https://www.cnblogs.com/sinlearn/p/13951754.html
Copyright © 2011-2022 走看看