线性表是一种最常用、最简单,也是最基本的数据结构,它是学习其他数据结构的基础。
有顺序存储和链式存储两种存储结构来表示。
顺序储存结构表示的线性表称为顺序表,用链式存储结构表示的线性表成为链表。
链表又有单链表、双向链表、循环链表。。
线性表是 n 个数据元素所构成的有限序列,通常表示为(a0,a1,...,a i,a n-1 )。
其中下标为i的标识元素在线性表中的位序号,n 为表长,当 n=0 时,此线性表为空表。
线性表中的数据元素a仅仅时一个抽象符号。不同场合下可以是 字母,数字,记录或者其它更复杂的信息。
对于同一个线性表,其么一个数据元素的值虽然不同,但必须具有相同的数据类型。
而且,数据元素之间具有一种线性的或者“一对一”的逻辑关系。
<1> 第一个数据元素没有前驱,这个数据元素也称为开始点。
<2> 最后一个数据元素没有后继,这个数据元素也称为终端结点。
<3>除第一个和最后一个数据元素之外,其它元素有且仅有一个前驱和一个后继,
具有上述逻辑关系的数据结构也称为线性结构,线性表也是一种线性结构。
2.线性表的抽象数据类型
线性表的长度可以动态的增长或设缩短,可以对于线性表中任何数据元素进行放稳和查找,
数据元素的删除和插入操作也可以在线性表中的任何位置进行,求线性表中
指定数据元素的前驱和后继,可以将两个线性表合并成一个线性表,或者将一个
线性表可以拆分成两个或者多个线性子表。
/**
* 线性表抽象数据类型Java接口描述如下:
*/
public interface Ilist {
public void clear();
public boolean isEmpty();
public int length();
public Object get(int i);
public void insert(int i,Object x);
/**
* 在线性表的第i个元素前面插入x元素
* 若i=0,在表头插入,i=length()在表尾插入x。
*/
public void remove(int i);
public int indexOf(Object x);
public void display(); //输出线性表中各个数据元素的值
}
/**
* 要使用线性表的Java接口,还需要具体的类来实现该接口。
* Java接口的两种实现方法:1.基于顺序存储
* 2.基于链式存储实现的
*/
2.顺序表的特点
<1> 在线性表中逻辑上相邻的书元素,在物理存储结构上也是相邻的。
<2> 存储密度高,但应预先分配“足够应用”的存储空间,
这可能将会造成存储空间的浪费。
<3> 便随机存取。
<4> 不便于删除和插入操作。
package ch01;
import 数据结构.Ilist;
/**
* @author ${Jason}
* @date 2019/3/20
* @time 21:02
*/
/**
* 类包含成员变量和成员函数。
* 成员变量用来表示抽象类数据类型中定义的数据对象,
* 成员函数用来表示抽象数据类型定义的操作集合。
* 顺序表类实现接口Ilist,类中的public成员函数主要是接口Ilist中定义的成员函数。
*/
public class SqList implements Ilist {
private Object[] listElem; //线性表存储空间
private int curLen; //线性表的当前长度
public SqList(int maxSize){
curLen = 0;
listElem = new Object[maxSize];
}
@Override
public void clear() {
curLen = 0;
}
@Override
public boolean isEmpty() {
return curLen == 0;
}
@Override
public int length() {
return curLen;
}
@Override
public Object get(int i) throws Exception {
if( i < 0 || i > curLen - 1)
throw new Exception("第" + i +"个元素不存在 ");
return listElem;
}
@Override
public void insert(int i, Object x) throws Exception {
if(curLen == listElem.length)
throw new Exception("顺序表已经满");
if(i < 0 || i > curLen)
throw new Exception("插入位置不合法");
for(int j = curLen; j > i; j--)
listElem[j] = listElem[j - 1];
listElem[i] = x;
curLen++;
}
@Override
public void remove(int i) throws Exception {
if(i < 0 || i > curLen - 1)
throw new Exception("删除位置不合法");
for( int j = i; j < curLen - 1; j++)
listElem[j] = listElem[j + 1];
curLen--;
}
@Override
public int indexOf(Object x) {
int j = 0;
while (j < curLen && !listElem[j].equals(x))
j++;
if(j < curLen)
return j;
else
return -1;
}
@Override
public void display() {
for(int j = 0; j < curLen; j++)
System.out.print(listElem[j] + " ");
System.out.println();
}
}