数据结构-顺序表
描述:
n个类型相同的元素有顺序的队列,对于n>0,除第一个元素无直接前驱,最后一个元素无直接后继,其余元素都有一个直接前驱和一个直接后继
线性表的特点:
同一性:表中所有元素都属于同一种数据类型
有穷性:元素个数有限
有序性:相邻元素间存在序偶关系
抽象定义:
ADT {
数据元素: D = {a1,a2,...an | ai 属于集合D0, n>=0 , DO为某一数据类型}
结构关系: R = {<ai, ai+1> | ai,ai+1属于集合D0 , i = 1,2,...,n-1}
基本操作:
1.InitList(L)
操作前提:L为未初始化的线性表
操作结果:将L初始化为空表
2.ListLength(L)
操作前提:线性表L已存在
操作结果:如果L为空表则返回0,否则返回表中的元素个数
3.GetData(L,i)
操作前提:表L存在,且1<=i<=ListLength(L)
操作结果:返回表L中的第i个元素
4.InsList(L,i,e)
操作前提:表L存在,且1<=i<=ListLength(L)+1,且e为合法元素
操作结果:在L中第i个位置之前插入新的数据元素e,L的长度增加1
5.DelList(L,i,e)
操作前提:表L存在且非空,且1<=i<=ListLength(L)
操作结果:删除L表的第i个数据元素,并用e返回其值,L的长度减1
6.Locate(L,e)
操作前提:表L已经存在,e为合法数据元素值
操作结果:如果L中存在数据e,则将当前指针指向该元素数据e所在的位置,并返回TRUE,否则返回FALSE
7.DestroyList(L)
操作前提:线性表L已经存在
操作结果:将L销毁
8.ClearList(L)
操作前提:线性表L已经存在
操作结果:将L置空
9.EmptyList(L)
操作前提:线性表L已经存在
操作结果:如果L为空表则返回TRUE,否则返回FALSE
}
顺序存储结构:
1.关系线性化
2.节点顺序存
线性表的基本操作
1.查找:
a.按序号查找
b.按照内容查找
2.插入
实现
package com.dataStructure.chapter2; /** * 自定义顺序队列 */ public class ArrayList { /** * 初始队列尺寸 */ final static int MAXSIZE = 100; /** * 线性表定义 利用java Oject是祖宗的语法特性 */ private Object[] elem; /** * 记录线性表最后的一个元素所在位置 没有元素时-1 */ private int last = -1; public ArrayList() { initList(); } /** * 初始化 */ public void initList() { this.elem = new Object[MAXSIZE]; } /** * 按序号查找元素 * * @param i 位置 * @return 元素 * @throws Exception */ public Object getData(int i) throws Exception { if (emptyList(this)) { throw new Exception("list is empty"); } if (i > elem.length || i < 0) { throw new IndexOutOfBoundsException(); } return elem[i]; } /** * 顺序遍历 * * @param e 查找的元素 * @return 元素下标 * @throws Exception */ public int locate(Object e) throws Exception { if (emptyList(this)) { throw new Exception("list is empty"); } for (int i = 0; i < elem.length; i++) { if (e.equals(elem[i])) { return i; } } return -1; } /** * 线性表添加数据在i号位置 * * @param i 下标 * @param e 被插入的元素 * @return */ public boolean insList(int i, Object e) { if (last == elem.length - 1) { System.out.println("list full"); return false; } if (i < 0 || (i > last && last != -1)) { System.out.println("invalid insert location"); return false; } /* * 移位 */ for (int j = last; j >= i; j--) { elem[j + 1] = elem[j]; } elem[i] = e; last++; return true; } /** * 删除元素 * * @param i 下标 * @return 被移除的元素 */ public Object delList(int i) { if (i < 0 || i > last) { System.out.println("invalid insert location"); return null; } Object delElem = elem[i]; for (; i < last - 1; i++) { elem[i] = elem[i++]; } last--; return delElem; } /** * 校验线性表是否为空 * * @param list 线性表 * @return 是否为i空 */ public boolean emptyList(ArrayList list) { return last == -1; } }
测试类
package com.dataStructure.chapter2; import static org.junit.Assert.*; import org.junit.Test; public class ArrayListTest { @Test public void testGetData() throws Exception { ArrayList list = new ArrayList(); list.insList(0, "1"); String test = (String) list.getData(0); assertEquals("1", test); } @Test public void testLocate() throws Exception { ArrayList list = new ArrayList(); list.insList(0, "1"); assertEquals(0, list.locate("1")); } @Test public void testDelList() { ArrayList list = new ArrayList(); list.insList(0, "1"); list.delList(0); assertEquals(true, list.emptyList(list)); } }
浙公网安备 33010602011771号