数据结构—线性表的定义与基本操作【插入、删除、查找】(下)

简介: 数据结构—线性表的定义与基本操作【插入、删除、查找】

(四)顺序表上的基本操作实现

1. 插入&算法

需要:在顺序表第i个位置处插入一个新元素。

       顺序表插入操作:将第i个数据元素及其之后的所有的数据元素,后移一个存储位置,再将新元素插入到i处。


a0857487ba664da0878f3501559a8eec.png

注:接上述代码书写具体操作方法

       插入操作算法

package data.updateORadd;
public class SqList implements IList {
    private Object[] listElem ;    //线性表的存储空间
    private int curLen ;          //线性表的当前长度
    //在线性表的第i个数据元素之前插入一个值为x的数据元素
    @Override
    /**
     * @Param i 第i个位置
     * @Param x 需要插入的数据
     */
    public void insert(int i, Object x) {
        //0.1 满校验:存放实际长度 和 数组长度 一样
        if(curLen == listElem.length) {
            throw new Exception("已满");
        }
        //0.2 非法校验,在已有的数据中间插入 [0, curLen],必须连续,中间不能空元素
        if(i < 0 || i > curLen) {
            throw new Exception("位置非法");
        }
        //1 将i及其之后后移
        for(int j = curLen ; j > i; j --) {
            listElem[j] = listElem[j-1];
        }
        //2 插入i处
        listEle[i] = x;
        //3 记录长度
        curLen ++;    
    }
}

插入时间复杂度:O(n)

2. 删除&算法

       需求:将第i位置处元素删除

       删除操作:将第i个数据元素ai之后的所有数据元素向前移一个存储位置

b99e8b3f83c54524bacc22e9640e63bc.png

package data.updateORadd;
public class SqList implements IList {
    private Object[] listElem ;    //线性表的存储空间
    private int curLen ;          //线性表的当前长度
   //删除并返回线性表中的第i个数据
    @Override
   public void remove(int i ) throws Exception {
    // 0.1 校验非法数据
    if(i < 0 || i > curLen - 1 ) {
        throw new Exception("位置非法");
    }
    // 1 将i之后向前移动
    for(int j = i ; j < curLen - 1 ; j ++ ) {
        listElem[j] = listElem[j+1];
    }
    // 2 长度减一
    curLen--;
    }
}

删除时间复杂度:O(n)

3. 查找&算法

       需求:查找指定数据的索引号

       算法1:循环遍历已有数据,进行判断,如果有返回第一个索引号,如果没有返回-1

package data.updateORadd;
public class SqList implements IList {
    private Object[] listElem ;    //线性表的存储空间
    private int curLen ;          //线性表的当前长度
   //返回线性表在首次出现指定的数据元素的位序号,若线性表在不包括此元素,则返回-1
    @Override
   public int indexOf(Object x) {
     //遍历线性表
    for(int i = 0; i < curLen ; i ++) {
        //判断线性表中的数据元素是否存在指定的元素
        if(listElem[i].equals(x)) {
            return i;
        }
    }
    return -1;
    }
}

算法2:使用变量记录没有匹配到索引

package data.updateORadd;
public class SqList implements IList {
    private Object[] listElem ;    //线性表的存储空间
    private int curLen ;          //线性表的当前长度
   //返回线性表在首次出现指定的数据元素的位序号,若线性表在不包括此元素,则返回-1
    @Override
    public int indexOf(Object x){
        int j = 0 ;  //用于记录索引信息
        //while循环,循环条件是:j 小于线性表的长度,
        // 并且第j个数不等于要查找的数据,都满足才可进行循环。
        while (j < curLen && !listElem[j].equals(x)){
            //进行循环对其j进行++
            j ++ ;
        }
        // j 记录索引的数量
        if (j < curLen) {
            return j ;
        }else {
            return  -1 ;
        }
    }
}

查询时间复杂度:O(n)

4. 顺序表的应用实例

        编程实现:建立一个顺序表('a','z','d','m','z'),然后查询顺序表中第一次出现字母'z' 的数据元素,并输出其在线性表中的位置

               线性表接口

package data.updateORadd;
public interface IList {
    public void clear() ;  //清空
    public boolean isEmpty();  //判断是否为空
    public int length();   // 表的长度
    public Object get(int i) throws Exception; //获取元素的值
    public void insert(int i , Object x) throws Exception; //在指定位置,插入指定元素
    public void remove(int i ) throws Exception; //删除指定元素
    public int indexOf(Object x) ;  //查找指定元素第一次出现的位置
    public void display() ;  //输出元素的值
}

线性表接口实现类:顺序表类

package data.updateORadd;
public class SqList implements IList {
    private Object[] listElem ;    //线性表的存储空间
    private int curLen ;          //线性表的当前长度
    //顺序表类的构造函数,构造一个存储空间容量为maxSize的线性表
    public SqList(int maxSize) {
        curLen = 0 ;  //置顺序表的当前长度为0
        listElem = new Object[maxSize];  //为顺序表分配maxSize个存储单元
    }
    //将一个一存在的线性表置为空表
    @Override
    public void clear() {
        curLen = 0 ;   //置顺序表的当前长度为0
    }
    //判断线性表的数据元素的个数是否为0 ,若为0则返回true,反之返回false
    @Override
    public boolean isEmpty() {
        return curLen == 0;
    }
    //求线性表中的数据元素的个数并返回值
    @Override
    public int length() {
        return curLen;
    }
    //读取到线性表中的第i个数据元素并有函数返回其值。其中i的取值范围为:0 <= i <= length()-1
    //若i 值不在此范围则抛出异常
    @Override
    public Object get(int i) throws Exception {
        if (i < 0 || i > curLen -1 ) {  //i 小于或者大于表长-1
            throw new Exception("第"+i+"个元素不存在");  //抛出异常
        }else {
            return listElem[i] ;  //返回顺序表中的第i个元素
        }
    }
    //在线性表的第i个数据元素之前插入一个值为x的数据元素
    @Override
    public void insert(int i, Object x) throws Exception {
        //0.1 满校验:存放实际长度 和 数组长度 一样
        if(curLen == listElem.length) {
            throw new Exception("已满");
        }
        //0.2 非法校验,在已有的数据中间插入 [0, curLen],必须连续,中间不能空元素
        if(i < 0 || i > curLen) {
            throw new Exception("位置非法");
        }
        //1 将i及其之后后移
        for(int j = curLen ; j > i; j --) {
            listElem[j] = listElem[j-1];
        }
        //2 插入i处
        listElem[i] = x;
        //3 记录长度
        curLen ++;
    }
    //删除并返回线性表中的第i个数据
    @Override
    public void remove(int i) throws Exception {
        // 0.1 校验非法数据
        if(i < 0 || i > curLen - 1 ) {
            throw new Exception("位置非法");
        }
        // 1 将i之后向前移动
        for(int j = i ; j < curLen - 1 ; j ++ ) {
            listElem[j] = listElem[j+1];
        }
        // 2 长度减一
        curLen--;
    }
    //返回线性表在首次出现指定的数据元素的位序号,若线性表在不包括此元素,则返回-1
    @Override
    public int indexOf(Object x) {
        for(int i = 0; i < curLen ; i ++) {
            if(listElem[i].equals(x)) {
                return i;
            }
        }
        return -1;
    }
    //输出线性表中的数据元素
    @Override
    public void display() {
        for (int i = 0; i < curLen; i++) {
            //输出
            System.out.println(listElem[i]+" ");
        }
    }
}

案例代码实现

package data.updateORadd.test;
import data.updateORadd.SqList;
public class Demo01 {
    public static void main(String[] args) throws Exception {
        //构造一个含有10个存储单元的存储空间的空顺序表
        SqList L = new SqList(10);
        //初始化顺序表中前5个数据元素
        //在顺序表中指定位置插入指定元素
        L.insert(0,'a');
        L.insert(1,'z');
        L.insert(2,'d');
        L.insert(3,'m');
        L.insert(4,'z');
        //在顺序表中查找值元素为'z'的数据元素
        int order = L.indexOf('z');
        //判断顺序表中是否包含值为'z'的数据元素
        if (order != -1 ){
            System.out.println("顺序表中第一次出现值为z的数据元素的位置为:"+order);
        }else {
            System.out.println("此顺序表中不包含值为z的数据元素");
        }
    }
}

(五) 每日一练


17. 线性表是有 n 个( )的有限序列。


A.数据表


B.字符


C.数据元素


D.数据项


--------------------------------------------------------------------------------------------


18. 线性表是一个( )。


A.有限序列,可以为空


B.有限序列,不可以为空


C.无限序列,可以为空


D.无限序列,不可以为空


--------------------------------------------------------------------------------------------


19. 以下( )是一个线性表。


A.由 n 个实数组成的集合


B.由 100 个字符组成的序列


C.由所有整数组成的序列


D.所有奇数组成的序列


--------------------------------------------------------------------------------------------


20. 在线性表中,除了开始元素外,每个元素( )。


A.只有唯一的前驱元素


B.只有唯一的后即元素字符


C.有多个前驱元素


D.有多个后继元素


--------------------------------------------------------------------------------------------


21. 顺序表的最大有优点是( )。


A.存储密度大


B.插入运算方便


C.删除运算方便


D.可以方便地用于各种逻辑的存储表示


--------------------------------------------------------------------------------------------


22. 对于顺序表,访问编号为 i 的元素的时间复杂度为( )。


A. O(n)


B. O(1)  


C.O(nlog2n)


D.O(log2n)


顺序表具有,可高效的进行随机存取,所有题干是访问编号为i的元素,所有可以直接通过下标索引访问到,索引复杂度O(1)


--------------------------------------------------------------------------------------------


23. 对于顺序表,在编号为 i 处插入一个新元素的间复杂度为( )。


A. O(n)


B. O(1)


C.O(nlog2n)


D.O(log2n)


--------------------------------------------------------------------------------------------


24. 采用顺序查找法对长度为 n 的线性表进行查找(不采用表尾设监视哨的方法),最坏的


情况下要进行( )次元素间的比较。


A.n+2


B.n


C.n-1


D.n/2


章节仅是博主阅读书籍的总结和理解,若有不对或欠妥的地方,还请各位大佬批评指正!!!


相关文章
|
24天前
|
存储 C语言
数据结构中的线性表链式存储介绍及其基本操作
链式存储是线性表的一种重要存储方式,它通过节点和指针的结构,实现了灵活的动态存储管理。本文介绍了单向链表的基本操作,并提供了相应的C语言代码示例。理解和掌握链表的操作对学习和应用数据结构具有重要意义。希望这篇博客能帮助你更好地理解线性表的链式存储。
32 2
|
11天前
|
存储 测试技术
【数据结构】操作受限的线性表,栈的具体实现
【数据结构】操作受限的线性表,栈的具体实现
19 5
|
11天前
|
存储 测试技术
【数据结构】操作受限的线性表,队列的具体实现
【数据结构】操作受限的线性表,队列的具体实现
20 4
|
1月前
|
存储
数据结构学习记录——堆的插入(堆的结构类型定义、最大堆的创建、堆的插入:堆的插入的三种情况、哨兵元素)
数据结构学习记录——堆的插入(堆的结构类型定义、最大堆的创建、堆的插入:堆的插入的三种情况、哨兵元素)
14 2
|
1月前
|
机器学习/深度学习 存储
数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)
数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)
24 1
|
1月前
|
存储 机器学习/深度学习
数据结构学习记录——什么是图(抽象数据类型定义、常见术语、邻接矩阵表示法、邻接表表示法)
数据结构学习记录——什么是图(抽象数据类型定义、常见术语、邻接矩阵表示法、邻接表表示法)
24 0
|
1月前
|
算法
数据结构和算法学习记录——平衡二叉树(基本介绍、平衡因子、平衡二叉树的定义、平衡二叉树的高度)
数据结构和算法学习记录——平衡二叉树(基本介绍、平衡因子、平衡二叉树的定义、平衡二叉树的高度)
14 0
|
1月前
|
算法
数据结构和算法学习记录——初识二叉树(定义、五种基本形态、几种特殊的二叉树、二叉树的重要性质、初识基本操作函数)
数据结构和算法学习记录——初识二叉树(定义、五种基本形态、几种特殊的二叉树、二叉树的重要性质、初识基本操作函数)
11 0
|
11天前
|
算法 C语言
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
|
5天前
|
存储 缓存 算法
堆和栈的区别及应用场景
堆和栈的区别及应用场景