【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,一经查实,立即删除!

相关文章

Readhat中升级openssh

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

Readhat中作安全基线

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

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

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

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 的…

StringBuilder类

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

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

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

linux系统优化思路

文章目录一. 影响linux性能的因素1.系统硬件资源2.操作系统相关资源3.应用程序软件资源二. 分析系统性能涉及的人员1.Linux运维人员2.系统架构设计人员3.软件开发人员三. 系统性能分析工具四.思路总结一. 影响linux性能的因素 1.系统硬件资源 1&#xff09;cpu 2&#xff09;…

30分钟,让你成为一个更好的程序员

我相信激励是非常重要的。这也是为什么我常常把时间管理&#xff08;这些书激励我不管改进我的时间管理方法&#xff09;的书和软件开发拿出来看看。我最近刚看完一本 书&#xff0c;“Apprenticeship Patterns: Guidance for the Aspiring Software Craftsman”。这本书推动我…

如何启用计算机的远程服务,远程桌面服务,教您怎么打开远程桌面服务

远程桌面可以通过控制另一台电脑的功能&#xff0c;让网络管理员可以在家中安全的控制单位的服务器&#xff0c;而且这个功能是系统内置的&#xff0c;所以比使用其他第三方的远程控制工具更方便。那么我的重点来了&#xff0c;我今天就教你们怎么打开桌面远程服务&#xff0c;…

pipenv相关指令

pip install pipenv 安装pipenv pipenv install 创建虚拟环境 &#xff08;项目根目录下&#xff09; pipenv shell     进入虚拟环境&#xff08;如果不存在&#xff0c;则创建并进入虚拟环境&#xff09; pipenv install flask   安装模块 pipenv uninstall flask 卸…

Vmware上安装RedHat Linux 7.3操作系统手册

文章目录1&#xff0e;点击“创建新的虚拟机”&#xff0c;勾选“自定义”选项&#xff0c;点击一步&#xff1b;2&#xff0e;默认选择最高版本的workstations&#xff0c;点击下一步&#xff1b;3&#xff0e;选择“稍后安装操作系统”&#xff0c;点击下一步&#xff1b;4&a…

软件工程15 个人阅读作业1

Task1&#xff1a;注册个人博客账号 个人博客地址 https://www.cnblogs.com/bmr666/ Task2&#xff1a;注册码云账号 码云账号 https://gitee.com/bmr666 Task3&#xff1a;完成博客-阅读与思考 阅读参考材料&#xff0c;并回答下面几个问题&#xff1a; &#xff08;1&#xf…

Windows Server 2008操作系统安装手册

文章目录1&#xff0e;输入语言和其他首选项&#xff0c;然后单击“下一步”继续&#xff1b;2&#xff0e;点击“现在安装”&#xff0c;启动安装程序&#xff1b;3&#xff0e;选择要安装的操作系统&#xff0c;这里选择Windows Server 2008 R2 Enterprise&#xff08;完全安…

云计算机有哪些特征,你知道云计算有哪些核心特征吗?

你知道云计算有哪些核心特征吗?下面跟小编一起来了解下吧!!!1、敏捷&#xff1a;使用户得以快速的&#xff0c;且以低价格的获得技术架构资源。2、应用程序界面API的可达性是指允许软件与云以类似“人机交互这种用户界面设施交互相所相一致的方式”来交互。云计算系统典型的运…

域名劫持

转载于:https://www.cnblogs.com/xinghen1216/p/8548323.html

cesium html源码,Cesium源码的本地运行及调试

CesiumJS源码运行有两种方式&#xff1a;基于node.js运行官方下载地址&#xff1a;https://cesium.com/cesiumjs/下载解压后&#xff0c;在根目录安装依赖后&#xff0c;就可直接运行npm initnpm start如果调试代码呢&#xff0c;官方的示例都是在Sandcastle里放着&#xff0c;…

阿里云上Kubernetes集群联邦

摘要&#xff1a; kubernetes集群让您能够方便的部署管理运维容器化的应用。但是实际情况中经常遇到的一些问题&#xff0c;就是单个集群通常无法跨单个云厂商的多个Region&#xff0c;更不用说支持跨跨域不同的云厂商。这样会给企业带来一些担忧&#xff0c;如何应对可用区级别…

缺氧游戏计算机,缺氧PC最低什么配置一览 你觉得高吗

缺氧PC最低什么配置一览&#xff0c;你觉得高吗。游戏对于电脑有不同程度的要求&#xff0c;缺氧这款游戏也有着自己的配置要求&#xff0c;看看下面的缺氧PC最低什么配置一览&#xff0c;你的硬件够得上吗。缺氧最低配置&#xff1a;首先公布的是官 方配置需求&#xff0c;目前…

Diango博客--14.使用 Django 项目中的 ORM 编写伪造测试数据脚本

文章目录0.思路引导1.脚本目录结构2.使用 Faker 快速生成测试数据3.批量生成测试数据4.执行脚本5.效果展示0.思路引导 1&#xff09;为了防止博客首页展示的文章过多以及提升加载速度&#xff0c;可以对文章列表进行分页展示。 2&#xff09;不过这需要比较多的文章才能达到分…

基于Sql Server 2008的分布式数据库的实践

配置Sql Server 2008&#xff08;Win7&#xff09; 1.打开SQL server2012&#xff0c;使用windows身份登录 2.登录后&#xff0c;右键选择“属性”。左侧选择“安全性”&#xff0c;选中右侧的“SQL Server 和 Windows 身份验证模式”以启用混合登录模式 3.选择“连接”&#x…