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

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

第二章:线性表

(一)概述

               线性表:是一种最常用、最简单,也是最基本数据结构

               线性表是由n(n>= 0)个数据元素所构成的有限序列,且数据类型相同

               线性表中数据元素之间具有一种线性的或“一对一”的逻辑关系。线性表是一种线性结构。


               线性表可以用顺序存储和链式存储两种存储结构来表示。


                       使用顺序存储的线性表称为顺序表。


                       使用链式存储的线性表称为链表。


                       链表的分类:单链表、双向链表、循环链表。

(二)线性表的抽象数据类型描述


线性表的结构简单,其长度可以动态的增长或收缩。可对表中任何数据元素进行访问和查找。


               求线性表中指定数据元素的前驱和后继:


                       方法一:将两个线性表合并成一个线性表。


                       方法二:将一个线性表拆分成两个或多个线性子表。


               线性表中的几种主要的基本操作:


clear() : 清空,将线性表置为空表。

isEmpty() : 判断表是否为空,若为空,返回true;反之返回false。

length() : 求表中数据元素的个数,并返回个数的值。

get(i) : 读取并返回表中第i个数据元素的值。其 i 的取值范围为0 <= i <= length() - 1【表的最大索引长度】

insert(i,x):在表的第 i 个元素之前插入一个值为x的数据元素。i 的取值范围为0 <= i <= length()【表的长度】。当i=0 时,在表头插入x,当i=length()时,在表尾插入x 。

remove(i): 删除并返回表的第i个数据元素。i 的取值范围为0<= i <= length() 1  。

indexOf(x) : 返回表中首次出现指定元素x的位序号【索引】,若表中没有该数据,就返回-1。

display(): 输出表中的各个元素的值。

               线性表的抽象数据Java接口描述:

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

ava实现以上接口的两种实现方法:

                       基于顺序存储的实现

                       基于链式存储的实现


(三)线性表的顺序存储

1.定义

顺序表,就是顺序存储的线性表。

       顺序存储是用一组地址连续的存储单元依次存放线性表中各个数据元素的存储结构。

               在逻辑上,数据ABCD是连续

               在物理上,地址也是连续的

c48de97dab314939a96248a08c87f2fd.png

可以使用数组来描述数据结构中的顺序存储结构。


2.地址公式


//第i的地址 = 第一个地址 + 第几个 *   存储单位

Loc(ai)   =  Loc(a0) +    i   *   c


Loc(a0):a0的存储地址(此地址也称为线性表的基地址)


Loc(ai) :表示第i个元素的地址


c : 表示一个数据元素的 存储单元


—— 即顺序表具有按数据元素的位序号随机存取的特点。


f1dcff3cc4454669a6d0aa68c69275e2.png

3.  顺序表特点


在线性表中逻辑上相邻的数据元素,在物理存储位置上也是相邻的。


存储密度高。但需要预先分配“足够”的存储空间。


存储密度 = 数据元素存储空间 / 数据元素实际占用空间


在顺序表中,存储密度为1。


便于随机存储。(数组中可以通过下标进行存储)


不便于插入和删除操作。两种操作都会引起大量的数据移动


4. 顺序存储结构类的描述


       高级程序设计语言在程序编译时会为数组类型的变量分配到一片连续的存储区域,数据元素的值就可以依次存储在这片存储区域中。因数组类型也具有随机存储的特点,所以可以用数组来描述数据结构中的顺序存储结构。数组元素的个数对应存储区域的大小


       顺序存储结构在线性表Javav接口中的实现类:


                考虑到线性表的长度是可变的,且定义了变量curLen来记录线性表的实际长度。


public class SqList implements IList{
    private Object[] listElem ;    //线性表的存储空间
    private int curLen ;          //线性表的当前长度
}

9c4ed401117e417482ab530217f202cb.png

5. 顺序表类的描述

177d88bb196c40fa8109441b396a8391.png


顺序表类的Java语言描述代码—实现线性表IList接口,重写接口中方法。

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) {
        //{...}
    }
    //删除并返回线性表中的第i个数据
    @Override
    public void remove(int i) {
        //{...}
    }
    //返回线性表在首次出现指定的数据元素的位序号,若线性表在不包括此元素,则返回-1
    @Override
    public int indexOf(Object x) {
        //{...}
        return 0;
    }
    //输出线性表中的数据元素
    @Override
    public void display() {
        for (int i = 0; i < curLen; i++) {
            //输出
            System.out.println(listElem[i]+" ");
        }
    }
}


注:代码中的“ //{...} ” 表示实现方法,会在后面具体操作中实现。

相关文章
|
存储 算法 测试技术
【C++数据结构——线性表】求集合的并、交和差运算(头歌实践教学平台习题)【合集】
本任务要求编写程序求两个集合的并集、交集和差集。主要内容包括: 1. **单链表表示集合**:使用单链表存储集合元素,确保元素唯一且无序。 2. **求并集**:遍历两个集合,将所有不同元素加入新链表。 3. **求交集**:遍历集合A,检查元素是否在集合B中存在,若存在则加入结果链表。 4. **求差集**:遍历集合A,检查元素是否不在集合B中,若满足条件则加入结果链表。 通过C++代码实现上述操作,并提供测试用例验证结果。测试输入为两个集合的元素,输出为有序集合A、B,以及它们的并集、交集和差集。 示例测试输入: ``` a c e f a b d e h i ``` 预期输出:
409 7
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
591 5
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
本文档介绍了线性表的基本运算任务,涵盖顺序表和链表的初始化、销毁、判定是否为空、求长度、输出、查找元素、插入和删除元素等内容。通过C++代码示例详细展示了每一步骤的具体实现方法,并提供了测试说明和通关代码。 主要内容包括: - **任务描述**:实现顺序表的基本运算。 - **相关知识**:介绍线性表的基本概念及操作,如初始化、销毁、判定是否为空表等。 - **具体操作**:详述顺序表和链表的初始化、求长度、输出、查找、插入和删除元素的方法,并附有代码示例。 - **测试说明**:提供测试输入和预期输出,确保代码正确性。 - **通关代码**:给出完整的C++代码实现,帮助完成任务。 文档
428 5
|
存储 Java
数据结构第二篇【关于java线性表(顺序表)的基本操作】
数据结构第二篇【关于java线性表(顺序表)的基本操作】
196 6
|
存储
【数据结构】线性表和顺序表
【数据结构】线性表和顺序表
183 1
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
01(数据结构考研)线性表相关操作代码
01(数据结构考研)线性表相关操作代码
222 0
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
364 59
|
9月前
|
编译器 C语言 C++
栈区的非法访问导致的死循环(x64)
这段内容主要分析了一段C语言代码在VS2022中形成死循环的原因,涉及栈区内存布局和数组越界问题。代码中`arr[15]`越界访问,修改了变量`i`的值,导致`for`循环条件始终为真,形成死循环。原因是VS2022栈区从低地址到高地址分配内存,`arr`数组与`i`相邻,`arr[15]`恰好覆盖`i`的地址。而在VS2019中,栈区先分配高地址再分配低地址,因此相同代码表现不同。这说明编译器对栈区内存分配顺序的实现差异会导致程序行为不一致,需避免数组越界以确保代码健壮性。
194 0
栈区的非法访问导致的死循环(x64)
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
704 77