数据结构 | 如何实现线性表的顺序结构

liu-en-ci 2018-02-02 原文

数据结构 | 如何实现线性表的顺序结构

什么是线性表

线性表就是零个或多个数据元素的有限序列。
首先是一个序列,然后序列之间有顺序,序列中的元素如果存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且一个前驱和一个后继。

什么是线性表的顺序存储结构

线性表的顺序存储结构就是用一段地址连续的存储单元依次存储线性表的数据元素,也就是用数组去实现顺序存储结构。
下面用代码实现一下顺序结构。

首先写一个接口

接口主要描述一下实现类要实现哪些方法,这里顺序结构包括三个方法,分别是获得元素,插入元素以及删除元素的方法。

package com.stucture.sqlList;

/**
 * 线性表顺序存储结构的接口
 * 指的是用一段地址连续的存储单元存储线性表的数据元素
 * @ClassName: ISeqList
 * @author cier
 * @date 2018-1-22
 */

public interface ISeqList<T> {
    /**
     * 获得元素
     * @param i 需要获得第i个元素
     * @return
     */
    public T getElem(int i);

    /**
     * 插入元素
     * @param i 元素的插入位置
     * @param t 需要插入的元素
     * @return 是否成功删除
     */
    public boolean insertElem(int i,T t);

    /**
     * 删除元素
     * @param i 需要删除元素的位置
     * @return
     */
    public T deleteElem(int i);
}

然后写一个接口的实现类

该类主要实现了接口的三个方法,下面描述一下三个方法要注意的点。

获得元素方法
  1. 因为我这里用的泛型,所以返回的也是泛型的结果,用泛型的优点就是可扩展性更强了,在后面泛型可以不受类型的约束,可以使用整型,字符串型。
  2. 因为线性表的下标索引是从1开始的,所以我们返回的是 i-1 的数据元素

    插入元素方法
  3. 如果插入的位置不合理,打印错误语句并返回。
  4. 如果线性表的长度大于等于默认分配的MAXSIZE,答应错误语句并返回。
  5. 如果插入的位置不在表尾,那就从最后一个元素开始向前遍历到 i 个位置,分别将他们都向后移动一个位置。
  6. 将要插入元素填入数组 i-1 的位置处。
  7. 表长加 1。

    删除元素方法
  8. 如果线性表为空,打印错误语句并返回。
  9. 如果删除的位置不合理,打印错误语句并返回。
  10. 如果删除的元素不在表尾,那就从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置。
  11. 表长减 1。
    “`java
    package com.stucture.sqlList;

/**

  • @author cier
  • @date 2018/1/22 10:57
    */
    public class SeqList

    private T[] data; // 数组存储数据元素
    private int length; // 线性表当前长度

    public SeqList() {
    data = (T[]) new Object[MAXSIZE];
    }

    /**

    • 获得元素
    • @param i 需要获得第i个元素
    • @return
      */
      @Override
      public T getElem(int i) {
      if (i < 0 || i > MAXSIZE) {
      return null;
      }
      T t = data[i – 1];
      return t;
      }

    /**

    • 插入元素
    • @param i 元素的插入位置
    • @param t 插入的元素
    • @return
      */
      @Override
      public boolean insertElem(int i, T t) {
      // 线性表已经满了
      if (length == MAXSIZE) {
      System.out.println(“该线性表已经满了”);
      return false;
      }
      // 插入的位置不在范围内
      if (i < 1 || i > MAXSIZE) {
      System.out.println(“该位置不合法”);
      return false;
      }
      // 插入的位置不在表尾
      if (i < length) {
      for (int j = length; j >= i; j–) {
      data[j] = data[j – 1];
      }
      }
      // 线性表的下标是从1开始,但是数组的下标是从0开始的,所以插入的t是在 i-1 的位置
      data[i – 1] = t;
      length++;
      return true;
      }

    @Override
    public T deleteElem(int i) {

    // 线性表为空时
    if (length == 0) {
        System.out.println("线性表为空");
        return null;
    }
    // 删除的数据不在范围内时
    if (i < 1 || i > length) {
        System.out.println("删除位置不在范围内");
        return null;
    }
    T t = data[i - 1];
    for (int j = i; j < length; j++) {
        data[j - 1] = data[j];
    }
    length--;
    return t;

    }

    public T[] getData() {
    return data;
    }

    public void setData(T[] data) {
    this.data = data;
    }

    public int getLength() {
    return length;
    }

    public void setLength(int length) {
    if (length < 0 || length > MAXSIZE){
    System.out.println(“长度不合法”);
    }
    this.length = length;
    }
    }
    “`

    最后测试线性表

    测试线性表需要注意以下几点:

  1. 初始化线性表,这里我使用的是伪随机种子设置数组的长度以及数组中元素的值。
  2. 随机生成删除元素的下标,满足条件则自动删除元素。
  3. 随机生成插入元素的下标和数据,满足条件则自动插入元素。
  4. 最后展示线性表中的数据。
    “`java
    package com.stucture.sqlList;

import java.util.Random;

/**

  • 测试线性表
  • @author cier
  • @date 2018/1/22 11:47
    */
    public class SeqListTest {
    final int MAX = 25;
    Random r = new Random();
    SeqList

    public SeqListTest(){
    initSeqList();
    }

    /**

    • 创建一个线性表顺序存储结构
      */
      public void initSeqList(){
      seqList = new SeqList

      if (length > SeqList.MAXSIZE) {
      System.out.println(“该长度不合法”);
      }

      for (int i = 1; i<=length; i++){
      int j = r.nextInt(MAX);
      System.out.print(j + ” “);
      if (!seqList.insertElem(i,j)) {
      System.exit(0);
      }
      }
      System.out.println(“\n原始数组是:”);
      display(seqList);
      }

    /**

    • 测试删除元素
      */
      public void deleteElem() {
      int i = r.nextInt(MAX);
      System.out.println(“\n\n删除的位置是:”+i);
      Integer deleteNumber = seqList.deleteElem(i);
      if(deleteNumber == null) {
      System.exit(0);
      } else {
      System.out.println(“删除的元素是:”+ deleteNumber);
      System.out.println(“删除元素后数组是:”);
      display(seqList);
      }
      }

    /**

    • 测试随机插入方法
      */
      public void insertByRandom() {
      int i = r.nextInt(MAX);
      System.out.println(“\n\n随机插入的位置是:”+i);
      int elem = r.nextInt(MAX);
      System.out.println(“随机插入数据是:”+elem);
      seqList.insertElem(i,elem);
      System.out.println(“随机插入数据后数组是:”);
      display(seqList);
      }

    /**

    • 数据展示
      */
      public void display(SeqList seqList) {
      for (int i = 1; i < seqList.getData().length; i++) {
      if (seqList.getElem(i) != null){
      System.out.print(seqList.getElem(i) + ” “);
      }
      }
      System.out.println(“\n数组的长度为:”+seqList.getLength());
      }

    /**

    • 获取元素
      */
      public void getElem(){
      int i = r.nextInt(MAX);
      System.out.println(“\n获取位置为:”+i);
      System.out.println(“获取到的元素为:”+seqList.getElem(i));
      }

    public static void main(String[] args) {
    SeqListTest seqListTest = new SeqListTest();
    seqListTest.insertByRandom();
    seqListTest.deleteElem();
    seqListTest.getElem();
    }
    }

“`

关于运行结果

因为不是手动插入数据,删除数据,而是使用随机数自动插入和删除,所以结果会有很多组,不过没关系,多运行几次数据不一样反而能对比着得到结果,下面贴一个完美的运行结果。

产生的数组长度为:16
22 4 8 11 17 3 10 8 18 18 7 9 14 4 3 18
原始数组是:
22 4 8 11 17 3 10 8 18 18 7 9 14 4 3 18
数组的长度为:16

随机插入的位置是:12
随机插入数据是:14
随机插入数据后数组是:
22 4 8 11 17 3 10 8 18 18 7 14 9 14 4 3 18
数组的长度为:17

删除的位置是:15
删除的元素是:4
删除元素后数组是:
22 4 8 11 17 3 10 8 18 18 7 14 9 14 3 18 18
数组的长度为:16

获取位置为:17
获取到的元素为:18

发表于 2018-02-02 21:45 LuckJavaCi 阅读() 评论() 编辑 收藏

 

版权声明:本文为liu-en-ci原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/liu-en-ci/p/8407189.html

数据结构 | 如何实现线性表的顺序结构的更多相关文章

  1. Java 重写(Override)与重载(Overload) – 玉滨的博客

    Java 重写(Override)与重载(Overload) 重写(Override) 重写是子类对父类的允许 […]...

  2. Java 中为什么要设计包装类

    在 Java 中,万物皆对象,所有的操作都要求用对象的形式进行描述。但是 Java 中除了对象(引用类型)还有 […]...

  3. java——前台通过接口下载项目中的文件

      后台响应头: response.setHeader("content-type", "applicatio […]...

  4. java 泛型E T ?的区别

    Java泛型中的标记符含义:   E – Element (在集合中使用,因为集合中存放的是元素) […]...

  5. Java List添加元素 – Alex0111

    Java List添加元素 import java.util.ArrayList; public class  […]...

  6. javaweb-番外篇-Commons-FileUpload组件上传文件

    一、Commons-FileUpload简介 Commons-FileUpload组件   Commons是A […]...

  7. 一次频繁Full GC问题排查过程分享

    问题描述 应用收到频繁Full GC告警 问题排查 登录到对应机器上去,查看GC日志,发现YGC一分钟已经达到 […]...

  8. 记java应用linux服务单个CPU使用率100%分析

    记java应用linux服务单个CPU使用率100%分析 之前在做项目的过程中,项目完成后在linux服务器上 […]...

随机推荐

  1. HDU5950 矩阵快速幂(巧妙的递推)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意: […]...

  2. CEPH集群RBD快照创建、恢复、删除、克隆(转)

    CEPH集群RBD快照创建、恢复、删除、克隆(转)  Ceph支持一个非常好的特性,以COW(写时复制)的方式 […]...

  3. 绪论(编译原理知识点总结)

    绪论(编译原理知识点总结) 低级语言:   机器语言、汇编语言 高级语言:   不依赖具体机器、但也得翻译(编 […]...

  4. 安徽省地理信息系统应用成果 – 圣殿GIS

    安徽省地理信息系统应用成果 一、安徽省地理信息中心                        安徽省地理信 […]...

  5. 常见的端口号及其用途 – Innershar

    常见的端口号及其用途 一些常见的端口号及其用途如下: 21端口:FTP 文件传输服务 22端口:SSH 端口 […]...

  6. 一直用的移动硬盘加密软件Ulock竟然这么容易就别破解了,哎~~~~~ – 施杨

    一直用的移动硬盘加密软件Ulock竟然这么容易就别破解了,哎~~~~~                  今天 […]...

  7. 小甲鱼OD学习第12讲

    小甲鱼OD学习第12讲 这次我们的任务是破解这个需要特定的注册码的软件,如下图   我们从字符串入手,输入re […]...

  8. mikrotik ros CVE-2019–3924 DUDE AGENT VULNERABILITY

    原文: https://blog.mikrotik.com/security/cve-20193924-dud […]...

展开目录

目录导航