数据结构——线性表——顺序表
来源:互联网 发布:淘宝销量可以刷吗 编辑:程序博客网 时间:2024/06/01 13:59
1. 线性表
线性表是最常用且最简单的数据结构。简而言之,一个线性表是n个数据元素的有限序列。至于每一个元素的具体含义,在不同的情况下各不相同,它可以是一个数字或一个符号,也可以是一页书,甚至是更复杂的信息。
2. 线性表的特点
存在唯一一个被称作“第一个”的数据元素;
存在唯一的一个被称作“最后一个”的数据元素;
除第一个元素以外,集合中的每一个元素均只有一个前驱;
除最后一个以外,集合中的每一个元素均只有一个后继。
3. 线性表的源代码
AbstractLineMethod.java
package com.mycompany;import util.ObjectHolder;/** * Created by HP on 2017/9/6. */public interface AbstractLineMethod { /** * 初始化线性表 * @param size */ void initList(int size); /** * 销毁线性表 */ void destroyList(); /** * 清空线性表 */ void clearList(); /** * 线性表判空 * @return */ boolean listEmpty(); /** * 获取线性表的长度 * @return */ int listLength(); /** * 获取指定位置处的元素 * @param i * @param ele * @return */ public boolean getElem(int i, ObjectHolder ele); /** * 获取该元素在线性表中第一次出现的位置 * @param ele * @return */ public int locateElem(ObjectHolder ele); /** * 获取指定元素的前驱 * @param currentElem * @param preElem * @return */ public boolean priorElem(ObjectHolder currentElem,ObjectHolder preElem); /** * 获取指定元素的后继 * @param currentElem * @param nextElem * @return */ public boolean nextElem(ObjectHolder currentElem,ObjectHolder nextElem); /** * 在线性表的指定位置处插入元素 * @param i * @param ele * @return */ public boolean listInsert(int i,Object ele); /** * 删除线性表指定位置处的元素 * @param i * @param ele * @return */ public boolean listDelete(int i,ObjectHolder ele); /** * 循环遍历线性表 */ public void listTraverse();}
LineMethod.java
package com.mycompany;import util.ObjectHolder;/** * Created by HP on 2017/9/6. */public class LineMethod implements AbstractLineMethod{ private int m_size = 0; private Object[] m_pList = null; private int m_iLength = 0; /** * 初始化线性表 * @param size */ public void initList(int size){ this.m_size = size; this.m_pList = new Object[size]; this.m_iLength = 0; } /** * 销毁线性表 */ public void destroyList(){ this.m_pList = null; this.m_size = 0; this.m_iLength = 0; } /** * 将线性表指针归零 */ public void clearList(){ this.m_iLength = 0; } /** * 判空操作 * 如果线性表为空,则返回true否则返回false * @return */ public boolean listEmpty(){ if(this.m_iLength == 0){ return true; } return false; } /** * 返回线性表的长度 * @return */ public int listLength(){ return m_iLength; } /** * 获取指定位置处的元素 * @param i * @param ele * @return */ public boolean getElem(int i, ObjectHolder ele){ if(i < 0 || i >= m_size){ return false; } ele.object = this.m_pList[i]; return true; } /** * 寻找第一个满足ele的数据元素的位序 * @param ele * @return */ public int locateElem(ObjectHolder ele){ for(int i = 0;i < this.m_iLength; i++){ if(this.m_pList[i] == ele.object){ return i; } } return -1; } /** * 获取指定元素的前驱,如果存在,则返回true,不存在则返回false * @param currentElem * @param preElem * @return */ public boolean priorElem(ObjectHolder currentElem,ObjectHolder preElem){ //如果查找元素不位于线性表,则返回false int temp = locateElem(currentElem); if(temp == -1){ return false; } //第一个元素没有前驱,所以说应该加以排除 if(temp == 0){ return false; } preElem.object = this.m_pList[temp - 1]; return true; } /** * 获取指定元素的后继,如果存在则返回true,如果不存在则返回false * @param currentElem * @param nextElem * @return */ public boolean nextElem(ObjectHolder currentElem,ObjectHolder nextElem){ //如果所查找元素不是位于线性表中,则返回false int temp = locateElem(currentElem); if(temp == -1){ return false; } //最后一个元素没有后继,应该加以排除 if(temp == this.m_iLength -1){ return false; } nextElem.object = this.m_pList[temp + 1]; return true; } /** * 在指定位置处插入指定元素,如果插入成功则返回true,失败则返回false * @param i * @param ele * @return */ public boolean listInsert(int i,Object ele){ if(i < 0 || i > this.m_iLength){ return false; } for (int k = this.m_iLength - 1;k >= i;k --){ this.m_pList[k + 1] = this.m_pList[k]; } this.m_pList[i] = ele; this.m_iLength ++; return true; } /** * 在线性表中删除指定的元素,如果删除成功,则返回true,如果删除失败则返回false * @param i * @param ele * @return */ public boolean listDelete(int i,ObjectHolder ele){ if(i < 0 || i >= this.m_iLength){ return false; } ele.object = this.m_pList[i]; for(int k = i +1;k < this.m_iLength;k ++){ this.m_pList[k - 1] = this.m_pList[k]; } this.m_iLength --; return true; } /** * 循环遍历线性表中的元素 */ public void listTraverse(){ for(int i = 0;i < this.m_iLength;i ++){ System.out.println(this.m_pList[i]); } }}
Union.java
package util;/** * Created by HP on 2017/9/6. */public class ObjectHolder { public Object object;}
线性表是一个相当灵活的数据结构,它的长度可以根据需要增长或缩短,即对线性表的数据元素不仅可以进行访问,还可以进行插入和删除等操作。
下面是对于上面线性表所执行的CRUD操作
TestLineMethod.java
package com.mycompany;import org.apache.log4j.Logger;import org.junit.Assert;import org.junit.Test;import util.ObjectHolder;/** * Created by HP on 2017/9/7. */public class TestLineMethod { private static final Logger log = Logger.getLogger(TestLineMethod.class); public AbstractLineMethod createList(){ Object e1 = 3; Object e2 = 5; Object e3 = 7; Object e4 = 2; Object e5 = 9; Object e6 = 1; Object e7 = 8; AbstractLineMethod abstractLineMethod = new LineMethod(); abstractLineMethod.initList(10); abstractLineMethod.listInsert(0,e1); abstractLineMethod.listInsert(1,e2); abstractLineMethod.listInsert(2,e3); abstractLineMethod.listInsert(3,e4); abstractLineMethod.listInsert(4,e5); abstractLineMethod.listInsert(5,e6); abstractLineMethod.listInsert(6,e7); return abstractLineMethod; } /** * 测试增加数据 */ @Test public void testInsert(){ AbstractLineMethod abstractLineMethod = createList(); abstractLineMethod.listTraverse(); //输出结果:3,5,7,2,9,1,8 Assert.assertEquals(7,abstractLineMethod.listLength()); } /** * 测试删除数据 */ @Test public void testDelete(){ ObjectHolder ele = new ObjectHolder(); AbstractLineMethod abstractLineMethod = createList(); abstractLineMethod.listDelete(1,ele); abstractLineMethod.listTraverse(); //输出结果:3,7,2,9,1,8 Assert.assertEquals(6,abstractLineMethod.listLength()); } /** * 测试修改 * 修改操作实际上我们可以看做是两个基本操作的合成操作 * 也就是说修改操作我们可以看成是删除操作+新增操作,所以说我们在这里可以这样做 */ @Test public void testUpdate(){ ObjectHolder ele = new ObjectHolder(); AbstractLineMethod abstractLineMethod = createList(); //先执行删除操作 abstractLineMethod.listDelete(1,ele); //再执行插入操作 abstractLineMethod.listInsert(1,9); abstractLineMethod.listTraverse(); //输出结果:3,9,7,2,9,1,8 Assert.assertEquals(7,abstractLineMethod.listLength()); } /** * 查找数据 */ @Test public void testSearch(){ //被查找元素 ObjectHolder ele = new ObjectHolder(); ele.object = 7; AbstractLineMethod abstractLineMethod = createList(); abstractLineMethod.listTraverse(); //输出结果3,5,7,2,9,1,8 int i = abstractLineMethod.locateElem(ele); Assert.assertEquals(2,i); log.info("该元素第一次出现的位置为:" + i); } /** * 获取前驱 */ @Test public void testPriorElem(){ ObjectHolder ele = new ObjectHolder(); ObjectHolder current = new ObjectHolder(); current.object = 9; AbstractLineMethod abstractLineMethod = createList(); abstractLineMethod.listTraverse(); //输出结果3,5,7,2,9,1,8 Assert.assertEquals(true,abstractLineMethod.priorElem(current,ele)); Assert.assertEquals(2,ele.object); log.info("前驱元素为:" + ele.object); } /** * 获取后继元素 */ @Test public void testNextElem(){ ObjectHolder ele = new ObjectHolder(); ObjectHolder current = new ObjectHolder(); current.object = 9; AbstractLineMethod abstractLineMethod = createList(); abstractLineMethod.listTraverse(); //输出结果3,5,7,2,9,1,8 Assert.assertEquals(true,abstractLineMethod.nextElem(current,ele)); Assert.assertEquals(1,ele.object); log.info("后继元素为:" + ele.object); } /** * 获取指定位置处的元素 */ @Test public void testGetElem(){ ObjectHolder ele = new ObjectHolder(); AbstractLineMethod abstractLineMethod = createList(); abstractLineMethod.listTraverse(); //输出结果3,5,7,2,9,1,8 Assert.assertEquals(true,abstractLineMethod.getElem(2,ele)); Assert.assertEquals(7,ele.object); log.info("在索引值为2出的元素值为:" + ele.object); }}
4. 项目源码
文章中所引用的代码已经作为开源项目“linear-table”被我存放到了CSDN.NET上供大家下载,但是我这里并不贴出该项目在CSDN.NET中的源码,因为CSDN已经决定将CSDN.NET迁移到码云上,所以说我这里就直接上存放到码云上的开源项目“linear-table”。
CSDN.NET迁移到码云上的公告
- CODE 项目整体迁移到码云平台的公告
linear-table开源项目下载地址
- linear-table
阅读全文
0 0
- 基础数据结构——顺序线性表
- 数据结构——顺序线性表
- 数据结构——线性表及线性表顺序存储
- 数据结构——线性表——顺序表
- 数据结构——线性表之顺序表
- 数据结构之—线性表之—顺序表
- 数据结构(C++)——顺序表(线性表)
- 数据结构之——线性表之顺序表
- 数据结构线性表的综合实验——顺序表
- 数据结构顺序表——线性表实现
- 数据结构之线性表——顺序表(C#)
- 数据结构——线性表(顺序是先)
- 数据结构——线性表(顺序结构和链式结构)
- 数据结构C语言实现——顺序线性表SqList
- 数据结构与算法——线性表顺序存储结构
- 数据结构例程——线性表顺序存储的应用
- 数据结构例程——线性表顺序存储的应用
- 数据结构例程——线性表的顺序查找
- 防火墙
- 编程名词积累解析
- 人脸认证-ROC曲线绘制计算AUC和ACC
- Collections和Collection的区别
- discovery studio v2.5免费版下载 附安装教程
- 数据结构——线性表——顺序表
- Ubuntu 安装配置GitLab(企业版&社区版&个人版Git管理)
- keras的自编码实现
- [Java] 【源码】新手初探java网络编程——socket接口实现简单的客户机/服务器程序
- 类和对象
- Spring MVC 解决跨域问题&以及对@RequestBody的理解
- what's
- python3中的struct模块使用
- Python学习day02