数据结构1 线性表的顺序表示与实现(java)

本文介绍了线性表的概念、特点以及在Java中的顺序表示,包括线性表的构造、基本操作如初始化、销毁、清空、长度获取、查找、插入、删除和遍历的实现。
摘要由CSDN通过智能技术生成

线性表

2.1线性表的定义和特点

相同特性的数据元素的有限序列 (a1,a2,...,an) 元素性质必须相同,之间是线性关系 首节点没有前驱,尾节点没有后继 元素的数据类型可以是简单数据类型也可以是复杂数据类型

总结

  1. 线性表中的元素类型可以是简单数据类型,也可以是复杂类型

  2. 要从具体的应用中抽象出共性的逻辑结构和基本操作(抽象数据类型),然后实现其存储结构和基本操作

2.2线性表的顺序表示与实现

线性表定义如下

class List{ 数据对象(成员变量) 数据关系 基本操作(方法)...

} 基本操作1:

InitList()构造一个空的线性表

DestoryList()销毁线性表

ClearList()清空线性表

基本操作2:

ListEmpty()判断线性表是否为空

ListLength()获取线性表中的元素个数

基本操作3:

GetElement()获取线性表中的i个数据元素的值

LocateElem()查找元素e,返回数据元素的位置

基本操作4:

PriorElem()求当前元素的前驱元素

NextElem()求当前元素的后继元素

基本操作5:

ListInsert()在i处插入元素,1<=i<=List.length+1

插入后更新元素个数

基本操作6:

ListDelet()删除第i个元素1<=i<=List.length

删除后更新元素个数

ListTraverse()遍历线性表

逻辑和物理结构上都是相邻的,存储时需要占用连续的存储空间,中间不能空出存储单元。

优点:知道一个元素的地址可以找到其它元素的位置

数据类型:

public class SqList {
    private final int MAX_SIZE = 100;//顺序表的最大长度
    int[] data;//存储数据的数组(可以保存各种数据)
    int length;//顺序表中的元素个数
}

操作方法:

/**
 * 初始化顺序表
 * 初始化操作,建立一个空的线性表
 */
public void initList(){
    this.data = new int[MAX_SIZE];//初始化一个数组,长度为MAX_SIZE
    if (this.data == null){
        throw new OutOfMemoryError("内存分配失败!");
    }
    this.length = 0;//元素个数置0
}

/**
 * 销毁线性表
 */
public void destroyList(){
    if (this.length != 0){
        this.data = null;
        this.length = 0;
    }
}
/**
 * 清空线性表
 */
public void clearList(){
    this.length = 0;
}

/**
 * 获取顺序表长度
 * @return 顺序表长度
 */
public int getLength(){
    return this.length;
}

/**
 * 判断顺序表是否为空
 * @return b
 */
public boolean isEmpty(){
    return this.length==0;
}

/**
 * 返回第i个元素的值
 * @param i 元素位置
 * @return 元素值
 */
public int getElem(int i){
    if (i>=1 && i<=this.length){
        return this.data[i-1];
    }else {
        throw new RuntimeException("输入不合法");
    }
}

在线性表L中查找与指定值e相同的数据元素的位置

/**
 * 返回第i个元素的值
 * @param i 元素位置
 * @return 元素值
 */
public int getElem(int i){
    if (i>=1 && i<=this.length){
        return this.data[i-1];
    }else {
        throw new RuntimeException("输入不合法");
    }
}

/**
 * 在线性表L中查找与指定值e相同的数据元素的位置
 * @param e 要查找的元素值
 * @return 元素位置
 */
public int locateElem(int e){
    //顺序查找
    for (int i = 0; i < this.length; i++) {
        if (e == this.data[i]){
            return i+1;
        }
    }
    return 0;
}

/**
 * 随机插入元素
 * @param i 插入位置
 * @param data 插入数据
 */
public void insertElem(int i,int data){
    if (this.length >100){//先判断空间是否满了
        throw new RuntimeException("空间已满");
    }
    if (i<=0 || i>this.length+1){//再判断插入位置是否合法
        throw new RuntimeException("输入不合法");
    }
    for (int j = this.length-1; j >= i-1 ; j--) {
          this.data[j+1] = this.data[j];
    }
    this.data[i-1] = data;
    this.length++;
}

/**
 * 删除i处的元素
 * @param i 元素的位置
 */
public void listDelete(int i){
    if (this.length==0){
        throw new RuntimeException("顺序表为空");
    }
    if (i<=0 || i>this.length){//再判断插入位置是否合法
        throw new RuntimeException("输入不合法");
    }
    for (int j = i; j <= this.length-1 ; j++) {
        this.data[i-1] = this.data[i];
    }
    this.length--;
}

/**
 * 遍历顺序表
 */
public void listTraverse(){
    for (int i = 0; i < this.length; i++) {
        System.out.print(this.data[i] + " ");
    }
}

测试

package linkedlist;

public class SqListTest {
    public static void main(String[] args) {
        SqList sqList = new SqList();
        sqList.initList();
        sqList.insertElem(1,1);
        sqList.insertElem(1,2);
        sqList.insertElem(1,3);
        sqList.insertElem(1,4);
        sqList.insertElem(1,5);

        sqList.listTraverse();
        System.out.println();
        System.out.println(sqList.getElem(1));
        System.out.println(sqList.locateElem(4));
        System.out.println(sqList.isEmpty());
        System.out.println(sqList.getLength());
        sqList.listDelete(5);
        sqList.listTraverse();

    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值