【Java】 大话数据结构(1) 线性表之顺序存储结构

 

 本文根据《大话数据结构》一书,实现了Java版的顺序存储结构

顺序存储结构指的是用一段地址连续的存储单元一次存储线性表的数据元素,一般用一维数组来实现。

书中的线性表抽象数据类型定义如下(第45页):

实现程序:

package SqList;/*** * 几个注意点:* 1.初始化时,应考虑数组大小为负的情况* 2.在各操作中,当涉及到位置i时,都应考虑i位置不合理的情况* 3.插入操作中,需考虑线性表已满的情况*   删除、获取操作中,需考虑线性表为空的情况* 4.插入删除操作中,均应考虑插入或删除位置为表尾情况(似乎没必要)* 5.插入删除操作中,别忘了最后要改变表长* * 几点困惑:* 1.插入删除位置为表尾时,没有判断语句,循环部分也不会执行,判断是否在表尾会不会显得画蛇添足?*   (《大话》一书中进行了该判断)* 2.RuntimeException类型在逻辑异常时使用,因为异常暂时还没学很好,用法是否正确?* 3.查找元素时,是否使用equals()方法比较合适?* * 拓展* 1.可进一步添加add方法,直接在表尾添加新的元素* 2.可添加整表打印输出的方法* @author Yongh** @param <E>*/
public class SqList<E> {private Object[] data; //存储数据元素private int length; //线性表当前长度private int maxSize;//数组长度,即最大储存空间/** * 若初始化时未声明大小,则默认设置为20 */ public SqList(){//data=new Object[20];//length=0;/*直接利用this()更方便*/this(20);}/** * 初始化线性表 */ public SqList(int initialSize){if(initialSize<0) {throw new RuntimeException("数组大小为负,初始化失败!");				}else {this.maxSize =initialSize;this.data=new Object[initialSize];this.length=0;System.out.println("初始化成功!");}}/*** 判断线性表是否为空*/public boolean IsEmpty(){if (this.length==0) {System.out.println("表为空");return true;}System.out.println("表不为空");return false;			//return this.length==0    也可以直接这样}/*** 清空线性表*/public void ClearList() {this.length=0;System.out.println("线性表已清空!");}/***获取第i个位置的元素值*/public E GetElem(int i) {if(this.length==0) {throw new RuntimeException("空表,无法获取数据!");			}if(i<1||i>this.length) {throw new RuntimeException("数据位置错误!");}System.out.println("数据获取成功!");return (E) data[i-1];}/*** 查找元素,返回值为该元素位置,0代表查找失败*/public int LocateElem(E e) {for(int i=1;i<=this.length;i++) {if(e==data[i-1]) {	System.out.println("查找成功!");return i;                             }}System.out.println("查找失败!");return 0;}/*** 在第i个位置插入新元素*/public boolean ListInsert(int i,E e) {if(i<1||i>this.length+1) {throw new RuntimeException("插入位置错误:"+i);}if(this.length==this.maxSize) {/*1.无法继续插入*///System.out.println("表已满,无法继续插入!");//return false;/*2.增加容量*/maxSize=maxSize+10;Object[] newdata=new Object[maxSize];for (int k=1;k<=this.length;k++)newdata[k-1]=this.data[k-1];this.data=newdata;}if (i<=this.length) {  //插入数据不在表尾       **这个判断是否有必要呢?for(int j=this.length+1;j>i;j--) this.data[j-1]=this.data[j-2];		    }this.data[i-1]=e;	this.length++;  //表长改变勿忘System.out.println("插入成功!");return true;}/*** 删除第i个位置的元素,并用e返回其值*/public E ListDelete(int i) {if(this.length==0) {throw new RuntimeException("空表,无法执行删除操作!");}			if(i<1||i>this.length) {throw new RuntimeException("删除位置错误!");}E e=(E) this.data[i-1]; if(i<this.length) {   //删除数据不在表尾       **这个判断是否有必要呢?for(int j=i;j<this.length;j++) {this.data[j-1]=this.data[j];}}this.length--;System.out.println("删除成功!");return e;}/*** 返回线性表的元素个数*/public int ListLength() {return this.length;}	
}

  

测试代码:

  基本数据类型和引用类型各写了一个测试代码。

package SqList;public class SqListTest {public static void main(String[] args) {//SqList<Integer> nums =new SqList<Integer>(-1);SqList<Integer> nums =new SqList<Integer>(5);nums.IsEmpty();//System.out.println("——————————插入几个位置错误的情况——————————");//nums.ListInsert(6, 6);//nums.ListInsert(3, 3);//nums.ListInsert(0, 0);System.out.println("——————————插入1到5,并读取内容——————————");for(int i=1;i<=5;i++)nums.ListInsert(i, i);nums.IsEmpty();int num;for(int i=1;i<=5;i++) {num=nums.GetElem(i);System.out.println("第"+i+"个位置的值为:"+num);}System.out.println("——————————查找0、5、8是否在表中——————————");System.out.print("0的位置:");System.out.println(nums.LocateElem(0));		System.out.print("1的位置:");System.out.println(nums.LocateElem(1));	System.out.print("5的位置:");System.out.println(nums.LocateElem(5));	System.out.println("——————————删除2、5——————————");num=nums.ListDelete(2);System.out.println("已删除:"+num);num=nums.ListDelete(4);System.out.println("已删除:"+num);System.out.println("当前表长:"+nums.ListLength());for(int i=1;i<=nums.ListLength();i++) {num=nums.GetElem(i);System.out.println("第"+i+"个位置的值为:"+num);}nums.ClearList();nums.IsEmpty();		}
}

  

初始化成功!
表为空
——————————插入1到5,并读取内容——————————
插入成功!
插入成功!
插入成功!
插入成功!
插入成功!
表不为空
数据获取成功!
第1个位置的值为:1
数据获取成功!
第2个位置的值为:2
数据获取成功!
第3个位置的值为:3
数据获取成功!
第4个位置的值为:4
数据获取成功!
第5个位置的值为:5
——————————查找0、5、8是否在表中——————————
0的位置:查找失败!
0
1的位置:查找成功!
1
5的位置:查找成功!
5
——————————删除2、5——————————
删除成功!
已删除:2
删除成功!
已删除:5
当前表长:3
数据获取成功!
第1个位置的值为:1
数据获取成功!
第2个位置的值为:3
数据获取成功!
第3个位置的值为:4
线性表已清空!
表为空
SqListTest输出结果

 

package SqList;public class SqListTest2 {public static void main(String[] args) {SqList<Student> students =new SqList<Student>();students .IsEmpty();System.out.println("——————————插入1到5,并读取内容——————————");Student[] stus= {new Student("小A",11),new Student("小B",12),new Student("小C",13),new Student("小D",14),new Student("小E",151)};for(int i=1;i<=5;i++)students .ListInsert(i, stus[i-1]);students .IsEmpty();Student stu;for(int i=1;i<=5;i++) {stu=students .GetElem(i);System.out.println("第"+i+"个位置为:"+stu.name);}System.out.println("——————————查找小A、小E、小龙是否在表中——————————");System.out.print("小A的位置:");stu=stus[0];System.out.println(students .LocateElem(stu));		System.out.print("小E的位置:");stu=stus[4];System.out.println(students .LocateElem(stu));	System.out.print("小龙的位置:");stu=new Student("小龙",11);System.out.println(students .LocateElem(stu));	System.out.println("——————————删除小E、小B——————————");stu=students .ListDelete(2);System.out.println("已删除:"+stu.name);stu=students .ListDelete(4);System.out.println("已删除:"+stu.name);System.out.println("当前表长:"+students .ListLength());for(int i=1;i<=students .ListLength();i++) {stu=students .GetElem(i);System.out.println("第"+i+"个位置为:"+stu.name);}students .ClearList();students .IsEmpty();		}
}class Student{public Student(String name, int age) {this.name=name;this.age=age;}String name;int age;
}

  

初始化成功!
表为空
——————————插入1到5,并读取内容——————————
插入成功!
插入成功!
插入成功!
插入成功!
插入成功!
表不为空
数据获取成功!
第1个位置为:小A
数据获取成功!
第2个位置为:小B
数据获取成功!
第3个位置为:小C
数据获取成功!
第4个位置为:小D
数据获取成功!
第5个位置为:小E
——————————查找小A、小E、小龙是否在表中——————————
小A的位置:查找成功!
1
小E的位置:查找成功!
5
小龙的位置:查找失败!
0
——————————删除小E、小B——————————
删除成功!
已删除:小B
删除成功!
已删除:小E
当前表长:3
数据获取成功!
第1个位置为:小A
数据获取成功!
第2个位置为:小C
数据获取成功!
第3个位置为:小D
线性表已清空!
表为空
SqListTest2输出结果

 

 

转载于:https://www.cnblogs.com/yongh/p/9115683.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序复杂程度的定量度量

对程序复杂程度进行度量的目的 1.把程序的复杂程度乘以适当常数即可估算出软件中错误的数量以及软件开发需要用的工作量&#xff0c; 2.定量度量的结果可以用来比较两个不同的设计或两个不同算法的优劣&#xff1b; 3.程序的定量的复杂程度可以作为模块规模的精确限度。 …

Readhat中升级openssh

1.挂载yum源&#xff08;镜像&#xff09; 如何挂载yum源&#xff08;镜像&#xff09;&#xff0c;在本人的另外一篇博客中&#xff0c;请戳这里 2.安装升级所需依赖 由于升级ssh需要安装依赖&#xff0c;这里提前将所需依赖安装 指令&#xff1a; yum install -y zlib-dev…

android暂停活动,如何将Android暂停活动带到前面

我有一个活动启动异步任务,侦听来自服务器的消息.当用户点击主页按钮时,活动暂停,异步任务继续在后台运行.当某个消息到达时,我希望活动恢复并在不重新创建的情况下到达前面.我尝试了以下内容.机器人:launchMode "singleTop"intent new Intent(getBaseContext(), M…

软件开发人员怎样走好从技术到管理之路?

软件开发人员怎样走好从技术到管理之路&#xff1f;这是一部分技术人员思考和谈论的老话题。虽然我自己并没有丰富的管理经验&#xff0c;但还是想记载下这一段时间里对这一问题的想法。从我个人走过的路来看&#xff0c;要走顺这条路&#xff0c;应该做好三个方面&#xff1a;…

如何选择程序设计语言

程序设计语言是人和计算机通信的最基本的工具&#xff0c;会影响人的思维和解题方式&#xff0c;影响人和计算机通信的方式和质量&#xff0c;影响其他人阅读和理解程序的难易程度。 选择适宜的程序设计语言的原因&#xff1a; 1.根据设计去完成编码时&#xff0c;困难最少&am…

zabbix4

1.宏(Macros) 宏可以理解为一个用于文本替换模式的预设文本内容&#xff1b; 宏根据一系列预定义的规则替换一定格式的文本模式&#xff0c;一般情况下&#xff0c;解释器或编译器在遇到宏时会自动进行文本模式替换&#xff1b; 类似的&#xff0c;Zabbix可以基于宏保存预设文件…

结对项目——Subway

博客链接&#xff1a;结对项目-Subway 转载于:https://www.cnblogs.com/Dominic-Abraham/p/9117266.html

Readhat中作安全基线

文章目录1.新建文件夹并上传脚本2.修改脚本中设置root2用户的密码字段3.添加脚本的可执行权限4.执行脚本5.尝试使用root2登录验证1.新建文件夹并上传脚本 在根目录下的/openssh8&#xff08;没有则新建&#xff09;中上传脚本&#xff1a; 2.修改脚本中设置root2用户的密码字…

软件测试的准则

1.所有测试都应该能追溯到用户需求&#xff1b;2.应该远在测试开始之前就制定出测试计划&#xff1b;3.把Pareto原理应用到软件测试中&#xff1b;4.应该从“小规模”测试开始&#xff0c;并逐步进行“大规模”测试&#xff1b;5.穷举测试是不可能的&#xff1b;6.为了达到最佳…

在线计算机计器,计算机存储单位换算-电脑容量在线换算器

APP说明存储单位是一种计量单位。指在某一领域以一个特定量&#xff0c;或标准做为一个记录(计数)点。再以此点的某个倍数再去定义另一个点&#xff0c;而这个点的代名词就是计数单位或存储单位。二进制序列用以表示计算机、电子信息数据容量的量纲&#xff0c;基本单位为字节B…

WordPress插件开发-创建、停用、删除插件

插件存放目录 wp-content/plugins 创建一个插件 在plugins创建一个文件插件文件夹&#xff0c;命名最好加前缀&#xff0c;这个前缀可以使用你的名字或者你自己的域名&#xff0c;防止插件和别人重名&#xff0c;再创建一个PHP文件名字和你的插件名一样。我这里创建一个名为 yg…

在eclipse中使用hadoop插件

我的配置环境看我的上篇博文。 配置过程&#xff1a; &#xff08;1&#xff09;把插件放到eclipse/plugins目录下。&#xff08;我的版本上一篇也有&#xff09; &#xff08;3&#xff09;重启eclipse&#xff0c;配置Hadoop installation directory 如果插件安装成功&#…

从程序员到技术领导者

入行 你为什么要当程序员&#xff1f;每当我问起很多人入行的人&#xff0c;回答各不相同。 有很多人是因为喜欢。谁说过&#xff1a;热爱是最好的老师。当然&#xff0c;关键是热爱是否能支撑自己把爱好做成一份职业。但不论做多久&#xff0c;因为热爱或曾经热爱&#xff0…

黑盒测试和白盒测试

黑盒测试&#xff08;又称功能测试&#xff09;把程序看作一个黑盒子&#xff0c;完全不考虑程序的内部结构和处理过程。黑盒测试是在程序接口进行的测试&#xff0c;只检查程序功能是否能按照规格说明书的规定正常使用&#xff0c;程序是否能适当地接收输入数据并产生正确的输…

Diango博客--11.Nginx + Gunicorn + Supervisor 方式部署

文章目录0.部署前准备1.创建一个超级用户2.更新 SQLite33.安装 Python3 、pip3.6以及 Pipenv4.部署代码5.使用 Gunicorn6.启动 Nginx 服务器7.配置 Nginx8.关闭 DEBUG 模式&#xff0c;收集静态文件9.使用 Supervisor管理 Gunicorn 进程10.使用 CDN 加快 Bootstrap 和 jQuery 的…

计算机更改了用户名数据恢复,怎么把电脑更换用户后恢復到原来的用户呢?

如何让administrator帐户出现在登陆画面&#xff1f;安装Windows XP时&#xff0c;如果设置了一个管理员账户&#xff0c;那么系统内置没有密码保护的Administrator管理员账户是不会出现在用户登录列表中的。虽然它身在幕后&#xff0c;可却拥有系统最高权限&#xff0c;为了方…

StringBuilder类

1.1 StringBuilder类概述StringBuilder:是一个可变的字符串。字符串缓冲区类。 String和StringBuilder的区别&#xff1a;String的内容是固定的StringBuilder的内容是可变的1.1.1 拼接字符串耗费内存原因:每次拼接都会产生新的字符串对象,而利用StringBuilder来拼接字符串自始至…

如何使用搜索技巧来成为一名高效的程序员

没有人是完全独立的孤岛&#xff0c;每个人都是整体的一部分。—— 约翰多恩对于缺乏编程知识的人来说&#xff0c;完全有可能编写一个网页或小程序。如果在用Google搜索相关示例时幸运的话&#xff0c;可以搜到现成的代码。即使是经验丰富的程序员&#xff0c;通常也会为了节省…

电开大计算机应用基础作业,2016年电大-电大计算机应用基础作业 答案.doc

2016年电大-电大计算机应用基础作业 答案计算机作业2单项选择题&#xff1a;第1题:在Word中编辑文本时&#xff0c;编辑区显示的“水印”在打印时( )出现在纸上。(2分)A、不会B、全部C、一部分D、大部分第2题:Word文档以文件形式存放于磁盘中&#xff0c;其默认的文件扩展名为(…

软件测试的步骤

大型软件系统的测试过程基本上由模块测试、子系统测试、系统测试、验收测试和平行运行等五个步骤组成。 1.模块测试 在设计得好的软件系统中&#xff0c;每个模块完成一个清晰定义的子功能&#xff0c;而且这个子功能和同级其他模块的功能之间没有相互依赖关系。因此&#xff…