ADT 线性表 (List)
Data
Operation
void initList(*L); //创建并初始化一个空线性表,如果成功返回true,修改表传指针
bool listEmpty(L); //判断一个线性表是否为空,不修改表传值
void clearList(*L); //清空一个线性表,成功返回true
bool getElem(L,i,*e); //从某个位置取出元素并赋值给e(i的范围是[1,L.length]),修改e的值所以传递一个指针,成功返回true
int locateElem(L,e); //查找线性表中是否有e,如果有返回它的位置(从1开始),否则返回0表示失败
bool listInsert(*L,i,e); //插入一个元素e在第i个元素之前(i的取值范围是[1,L.length+1]) ,成功返回true
bool listDelete(*L,i,*e); //删除在第i个位置上的元素(i的取值范围是[1,L.length]),删除的元素赋给e,成功返回true
int listLength(L); //返回线性表的元素个数
endADT
java 的实现如下
import java.util.Arrays;
public class MyArray<T> {
//Data
private T[] array;
private int size;
//Operation
//不带参数初始化默认初始大小为10
public MyArray() {
this.array=(T[]) new Object[10];
size=0;
}
//带参初始化,并将size设置为0
public MyArray(int capacity){
this.array=(T[]) new Object[capacity];
size=0;
}
//返回数组真实大小
public int length(){
return size;
}
//在末尾添加 如果当下数组大小=容量 则进行扩容后再添加
public void add(T elem) {
if(size<0||size>array.length){
throw new IndexOutOfBoundsException("数组越界");
}
if (size>=array.length) {
resize();
System.out.println("reszie");
}
array[size]=elem;
size++;
}
//扩容 数组大小=容量 则将容量扩大为原来的2倍
public void resize() {
T[] arrayNew=(T[]) new Object[array.length*2];
System.arraycopy(array, 0, arrayNew, 0, array.length);
array=arrayNew;
}
//删除指定位置元素,先进行越界判断,然后记录要删除的元素,并将之后的元素向前移动一格,数组大小减1
public T delete(int index) {
if(index<0||index>array.length||size<1){
throw new IndexOutOfBoundsException("数组越界");
}
T res=array[index-1];
for (int i = index-1; i < size-1; i++) {
array[i]=array[i+1];
}
array[size-1]=null;
size--;
return res;
}
public void add(T elem,int index) {
if(index<0||index>array.length||size<1){
throw new IndexOutOfBoundsException("数组越界");
}
if (size>=array.length) {
resize();
System.out.println("reszie");
}
size++;
for (int i = size-1; i >index; i--) {
array[i]=array[i-1];
}
array[index-1]=elem;
}
@Override
public String toString() {
String res="[";
for (int i = 0; i < size; i++) {
if (i==size-1) {
res+=array[i];
}else {
res+=array[i]+",";
}
}
return res+"]";
}
}