线性表的顺序表示指的是用一组地址连续的存储单元以此存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序映像。通常,称这种存储结构的线性表为顺序表。特点是:逻辑上相邻的数据元素,其物理次序上也是相邻的

顺序表的存储示意图

假设线性表的每个元素与占用l个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储起始位置。则线性表中地i+1个数据元素的存储位置LOC(a i+1)和第i个数据元素的存储位置LOC(a i)之间有如下关系:

通常的,线性表的地i个数据元素ai的存储位置为:

每一个数据元素的存储位置都和线性表中的起始位置相差一个常数,这个常熟和数据元素在线性表中的位序成正比。所以,只要确定了存储线性表的起始位置,线性表中任意数据元素都可以随机存取。所以,线性表的顺序存储结构是一种随机存取的存储结构。

实现顺序表(java)

首先建立一个List接口,用来定义顺序表的一些操作

package 线性表的顺序结构;

public interface List {

	//返回顺序表的大小
public int size(); //判断线性表中是否为空
public boolean isEmpty(); //向线性表中插入数据元素
public boolean insert(int index, Object obj) throws Exception; //删除线性表中指定元素
public boolean delete(int index) throws Exception; //获取线性表的指定元素
public Object getElem(int index); //判断数据元素是否在链表中
public int searchList(Object obj); //销毁线性表
public void destroyList(); //将线性表置为空表
public void clearList(); //返回线性表中第一个值与obj相同的元素在线性表中的位置
public Object locateElem(Object obj); }

实现顺序表的操作方法:

package 线性表的顺序结构;

public class SqList implements List {

	//默认的顺序表的最大长度
final int DefaultSizs = 10; //顺序表的长度最大值
int MaxSize; //顺序表的当前长度
int size; //用于存储顺序表的数据元素
Object[] listArray; public SqList() {
this.init(this.DefaultSizs);
} public SqList(int size) {
this.init(size);
} /**
* 初始化顺序表
* @param size
*/
public void init(int size) {
this.MaxSize = size;
this.size = 0;
this.listArray = new Object[size];
} @Override
/**
* 获得顺序表的长度
*/
public int size() {
// TODO Auto-generated method stub
return size;
} @Override
/**
* 判断顺便表是否为空
*/
public boolean isEmpty() {
// TODO Auto-generated method stub
return size == 0;
} @Override
/**
* 在指定位置插入数据元素到顺序表
*/
public boolean insert(int index, Object obj) throws Exception {
// TODO Auto-generated method stub
if(index < 1 || index > size + 1) return false;
if(size >= MaxSize) return false; for(int j = size - 1; j >= index; j--) {
this.listArray[j + 1] = this.listArray[j];
}
this.listArray[index - 1] = obj;
++size;
return true;
} @Override
/**
* 删除顺序表中指定位置的数据元素
*/
public boolean delete(int index) throws Exception {
// TODO Auto-generated method stub
if(index < 1 || index > size) return false;
for(int j = index; j <= size - 1; j++) {
this.listArray[j - 1] = this.listArray[j];
}
--size;
return true; } @Override
/**
* 获得指定数据元素
*/
public Object getElem(int index) {
// TODO Auto-generated method stub
if(index < 1 || index > size) return null;
return this.listArray[index - 1];
} @Override
/**
* 查找数据元素是否在顺序表中
* 若在表中,返回该数据元素在顺序表的序号
*/
public int searchList(Object obj) {
// TODO Auto-generated method stub
for(int j = 0; j < size; j++) {
if(this.listArray[j] == obj) return j + 1;
}
return 0;
} public static void main(String[] args) {
SqList list = new SqList(2);
try {
list.insert(1, 100);
list.insert(2, 50);
list.insert(3, 20);
list.insert(4, 90); for (int i = 1; i <= list.size; i++) {
System.out.println("第" + i + "个数为" + list.getElem(i));
} } catch (Exception e) {
e.printStackTrace();
}
} @Override
/**
* 销毁顺序表
*/
public void destroyList() {
// TODO Auto-generated method stub
this.listArray = null;
this.size = 0;
} @Override
/**
* 清空顺序表
*/
public void clearList() {
// TODO Auto-generated method stub
if(this.listArray != null && this.listArray.length != 0) {
this.listArray = new Object[this.MaxSize];
}
} @Override
public Object locateElem(Object obj) {
// TODO Auto-generated method stub
for(int j = 0; j < size; j++) {
if(this.listArray[j] == obj) return j + 1;
}
return null;
} }

但是在上面的代码中我们和容易的看到一个缺点,那就是存放数据元素的数组是定长的,即,上面实现的顺序表是静态顺序表。那么当数据量很大的时候,我们需要进行扩容,否则无法存储下所有数据。

修改SqList类,增加一个判断是否需要扩容的方法:

	//进行扩容
public void seqListDempty() {
if(size == MaxSize) {
MaxSize *= 2;
Object[] newArr = new Object[MaxSize];
for (int i = 0; i < size; i++) {
newArr[i] = this.listArray[i];
}
this.listArray = newArr;
}
}

同时修改insert()方法:

	@Override
/**
* 在指定位置插入数据元素到顺序表
*/
public boolean insert(int index, Object obj) throws Exception {
// TODO Auto-generated method stub
if(index < 1 || index > size + 1) return false;
if(size >= MaxSize) seqListDempty(); for(int j = size - 1; j >= index; j--) {
this.listArray[j + 1] = this.listArray[j];
}
this.listArray[index - 1] = obj;
++size;
return true;
}

这样我们就实现了动态顺序表

线性表中顺序表的的理解和实现(java)的更多相关文章

  1. [Java算法分析与设计]--线性结构与顺序表(List)的实现应用

    说到线性结构,我们应该立马能够在脑子里蹦出"Array数组"这个词.在Java当中,数组和对象区别基本数据类型存放在堆当中.它是一连串同类型数据存放的一个整体.通常我们定义的方式为 ...

  2. C#线性表之顺序表

    线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: ...

  3. c/c++ 线性表之顺序表

    线性表之顺序表 存储在连续的内存空间,和数组一样. 下面的代码,最开始定义了一个能存8个元素的顺序表,当超过8个元素的时候,会再追加开辟空间(函数:reInit). 实现了以下功能: 函数 功能描述 ...

  4. [C++]线性链表之顺序表<一>

    顺序表中数据元素的存储地址是其序号的线性函数,只要确定了存储顺序表的起始地址(即 基地址),计算任意一个元素的存储地址的时间是相等的,具有这一特点的存储结构称为[随机存储]. 使用的基本数据结构:数组 ...

  5. 线性表之顺序表C++实现

    线性表之顺序表 一.头文件:SeqList.h //顺序线性表的头文件 #include<iostream> ; //定义顺序表SeqList的模板类 template<class ...

  6. [C++]线性链表之顺序表<二>

    /*   @content 线性链表之顺序表   @date 2017-3-21 1:06   @author Johnny Zen  */ /* 线性表     顺序表     链式表[带头指针/不 ...

  7. [数据结构 - 第3章] 线性表之顺序表(C++实现)

    一.类定义 顺序表类的定义如下: #ifndef SEQLIST_H #define SEQLIST_H typedef int ElemType; /* "ElemType类型根据实际情况 ...

  8. [C++]数据结构:线性表之顺序表

    1 顺序表 ADT + Status InitList(SeqList &L) 初始化顺序表 + void printList(SeqList L) 遍历顺序表 + int ListLengt ...

  9. 数据结构Java实现02----线性表与顺序表

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

随机推荐

  1. mongodb查询速度慢是什么原因?

    mongodb查询速度慢是什么原因? 通过mongodb客户端samus代码研究解决问题         最近有项目需要用到mongodb,于是在网上下载了mongodb的源码,根据示例写了测试代码, ...

  2. 2-ubuntu下访问window的磁盘

    双系统Ubuntu无法进入Windows磁盘的解决方法 有些用户在电脑上安装了Ubuntu和Win10的双系统,正常情况下Ubuntu是可以正常访问Windows磁盘的.但是有些用户就是无法再Ubun ...

  3. Error while trying to retrieve text for error ORA-12154

    问题描述:vs中调试运行没有任何错误,但是发布到IIS中访问,就会报以上错误.IIS不会调试,所以一头雾水,不止错误在哪里. 分析:看到网上有人分析了Web.config模拟验证的问题恍然大悟: 原文 ...

  4. 可跨平台C++开源图形图像框架:openFrameworks

    博客参考:https://www.hahack.com/codes/openframeworks-intro/#%E4%BB%80%E4%B9%88%E6%98%AF-openframeworks 和 ...

  5. 拒绝枯燥,有意思的 Loading 页面动效设计

    互联网时代,网络“提速”日益频繁,人们打开Web或软件的速度越来越快,一般页面缓冲和加载地过程也是几不可查.然而,在某些情况下,例如软件急需加载大量页面,首页急需加载大量内容,用户下载文件过大,甚至是 ...

  6. 删除重复记录的最新sql脚本

    delete from tb1   where id in(select t2.minnum from(select MIN(t1.id) as minnum,t1.col1 as ars ,COUN ...

  7. 关于Safari浏览器使用的几点总结

    声明:下载的是Safari英文版本,在Windows操作系统下使用. 一.Safari浏览器中的开发者调试工具隐藏得比较深,找了好久才找到的,方法:按一下键盘上的alt键,浏览器上方就会弹出一个开发者 ...

  8. CodeForces 681B Economy Game (暴力)

    题意:给定一个数,问能不能 找到非负 a, b, c,使得 a × 1 234 567 + b × 123 456 + c × 1 234 = n. 析:二重循环,去确定c. 代码如下: #inclu ...

  9. pthread_rwlock_rdlock和“No such file or directory”

    pthread_rwlock_rdlock和"No such file or directory" 调用pthread_rwlock_rdlock时,如果失败报错"pth ...

  10. LARGE SCALE GAN TRAINING FOR HIGH FIDELITY NATURAL IMAGE SYNTHESIS

    最强GAN图像生成器,真假难辨 论文地址: https://openreview.net/pdf?id=B1xsqj09Fm 更多样本地址: https://drive.google.com/driv ...