数据结构与算法——线性表之顺序表(JAVA语言实现 )
线性表是由n个数据元素组成的优先序列。
线性表中每个元素都必须有相同的结构,线性表是线性结构中最常用而又最简单的一种数据结构。线性表由存储结构是否连续可分为顺序表和链表。顺序表指线性表中每个元素按顺序依次存储,线性表中逻辑上相邻的两个元素其在内存中的地址也是相邻的。而链表指的是每个数据元素存储不一定连续的一种数据结构,即链式存储。从内存中的分布来说,下一个元素的地址在与其相邻的上一个节点中存储,即链表每个节点的值由两部分组成,一部分是数据域,另一部分存一个引用(即指针,或者说是一个地址),指向该节点的下一个节点。
下面的代码是一个简单的顺序结构线性表的源代码,这个类部分实现了ArrayList的功能。
public class SequenceList<T> {
private int DEFAULT_SIZE = 10; //线性表中最大元素个数
private int capacity; //保存数组长度
private Object[] elementData;
private int size = 0;
public SequenceList() {
capacity = DEFAULT_SIZE;
elementData = new Object[capacity];
}
//以初始化元素创建顺序线性表
public SequenceList(int element) {
this();
elementData[0] = element;
size++;
}
//以定长数组创建线性表
public SequenceList(T element,int initSize) {
capacity = 1;
while(capacity < initSize) {
capacity <<= 1;
}
elementData = new Object[capacity];
elementData[0] = element;
size++;
}
//获取线性表长度
public int length() {
return size;
}
//获取表中下标为i的元素值
public T getData(int i) {
if(i < 0 || i > size) {
throw new IndexOutOfBoundsException("线性表索引越界");
}
return (T)elementData[i];
}
//顺序表的查找(查找索引)
public int search(T data) {
for(int i = 0;i < size;i++) {
if(elementData[i] == data) {
return i;
}
}
System.out.println("Not found!!!");
return -1;
}
//向线性表中下标为index的地方插入一个元素
public void insert(T data,int index) {
if(index < 0 || index >size) {
throw new IndexOutOfBoundsException("线性表索引越界");
}
if(size > DEFAULT_SIZE) {
System.out.println("顺序表中元素个数已达上限,不能再插入数据");
return;
}
//插入操作
System.arraycopy(elementData, index, elementData, index+1, size-index);
elementData[index] = data;
size++;
}
//在表的末尾插入元素
public void addElement(T data) {
insert(data,size);
}
//删除表中指定索引处的元素
public void delete(int index) {
if(index < 0 || index >size) {
throw new IndexOutOfBoundsException("线性表索引越界");
}
T t = (T)elementData[index];
int num = size-index-1;
if(num > 0) {
System.arraycopy(elementData, index+1, elementData, index, num);
}
size--;
System.out.println("删除成功");
}
//判断表是否为空
public boolean isEmpty() {
return size == 0;
}
//清空线性表
public void makeEmpty() {
size = 0;
}
}
测试代码:
public class Test {
public static void main(String[] args) {
SequenceList<String> stringList = new SequenceList<String>();
stringList.addElement("111");
stringList.addElement("222");
stringList.addElement("444");
stringList.insert("333", 2);
for(int i=0;i<stringList.length();i++) {
System.out.print(stringList.getData(i)+" ");
}
System.out.println();
System.out.println("元素“111”在顺序表中的下标为 :"+stringList.search("111"));
}
}