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

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

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

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


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


相关文章
|
1月前
|
存储 Java
数据结构第二篇【关于java线性表(顺序表)的基本操作】
数据结构第二篇【关于java线性表(顺序表)的基本操作】
30 6
|
17天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
存储
【数据结构】线性表和顺序表
【数据结构】线性表和顺序表
22 1
|
1月前
01(数据结构考研)线性表相关操作代码
01(数据结构考研)线性表相关操作代码
59 0
|
1月前
|
存储 C语言
数据结构之线性表的初始化及其操作
数据结构之线性表的初始化及其操作
36 0
|
2月前
MITK中的数据结构和常量定义
本文介绍了MITK中的数据结构、反射机制、常量定义、DataNode类和类宏定义,包括多图映射、反射接口、事件宏和属性列表等高级特性。
|
2月前
|
存储 Java
java数据结构,线性表顺序存储(数组)的实现
文章介绍了Java中线性表顺序存储(数组)的实现。线性表是数据结构的一种,它使用数组来实现。文章详细描述了线性表的基本操作,如增加、查找、删除、修改元素,以及其他操作如遍历、清空、求长度等。同时,提供了完整的Java代码实现,包括MyList接口和MyLinearList实现类。通过main函数的测试代码,展示了如何使用这些方法操作线性表。
|
14天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
90 9
|
5天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
15 1
|
8天前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。

热门文章

最新文章