要求:定义一个线性表要满足能够添加元素,插入元素,删除元素,定位元素,取表元素,取表长度,清空表等操作。
一、:使用顺序表实现
1.定义一个接口
public interface ILinarList <E>{ //定义一个泛型接口
boolean add(E item); //添加元素
boolean add(int i, E item); //插入元素
E remove (int i); //删除元素
int indexOf(E item); //定位元素
E get(int i); //取表元素
int size(); //取表长度
void clear(); //清空表
boolean isEmpty(); //判断表是否为空
}
2.实现线性表
import java.lang.reflect.Array;
public class SeqList<E> implements ILinarList<E> {
//泛型类 采用具体的存储结构实现抽象的数据类型
private int maxsize;
private E[] data;
private int size;
@SuppressWarnings("unchecked")
public SeqList(Class<E> type, int maxsize) {
this.maxsize = -maxsize;
data = (E[]) Array.newInstance(type, maxsize);
//在(E[])后的是object类,所有其他类的基类,需要强制转换
size = 0;
}
// 添加元素,
public boolean add(E item) {
if (!isfull()) { //isfull函数 判断表满了没?
data[size] = item;
size++; //把元素添加到顺序表的末尾
return true;
} else
return false;
}
// 插入元素,插入到指定的i处
public boolean add(int i, E item) {
if (i < 0 || i > size) {
throw new IndexOutOfBoundsException("Index :" + i + ", size :"
+ size);
}
if (!isfull()) {
for (int j = size - 1; j >= 1; j--) { //for循环j--从后往前移
data[j + 1] = data[j];
}
data[i] = item;
size++; //长度加1
return true;
} else
return false;
}
//删除元素,
public E remove(int i) {
rangeCheck(i);
if (!isEmpty()) { //该位置不是空的情况下
E oldValue = data[i];
for (int j = i; j < size - 1; j++) { //往前移,由i开始到size-1。
data[j] = data[j + 1];
}
data[--size] = null; // 将data[size-1]的值清空
return oldValue;
} else
return null;
}
//定位元素,
public int indexOf(E item) {
if (item == null) {
for (int i = 0; i < size; i++)
if (data[i] == null)
return i;
} else {
for (int i = 0; i < size; i++)
if (item.equals(data[i]))
return i;
}
return -1;
}
//取表元素 返回指定值i的数据元素
public E get(int i) {
rangeCheck(i); //判断该位置是否合法
return data[i];
}
public int size() {
return size;
}
public void clear() {
for (int i = 0; i < size; i++) {
data[i] = null;
}
size = 0;
}
public boolean isEmpty() {
return size == 0;
}
public boolean isfull() {
if (size == maxsize) {
return true;
} else
return false;
}
private void rangeCheck(int i) {
if (i < 0 || i > size) {
throw new IndexOutOfBoundsException("Index :" + i + ", size :"
+ size);
}
}
}
3.测试test
import java.util.Scanner;
public class TestList {
public static void main(String[] args) {
ILinarList<Integer>list =new SeqList<Integer>(Integer.class,50);
int []data ={23,45,3,7,6,945};
Scanner sc = new Scanner(System.in);
System.out.println("-------------------------");
System.out.println("操作选项菜单");
System.out.println("1.添加元素");
System.out.println("2.插入元素");
System.out.println("3.删除元素");
System.out.println("4.定位元素");
System.out.println("5.取表元素");
System.out.println("6.显示线性表");
System.out.println("0.退出");
System.out.println("------------------------");
char ch;
do {
System.out.println("请输入操作选项:");
ch=sc.next().charAt(0);
switch(ch){
case'1' :
for (int i = 0; i < data.length; i++) {
list.add(data[i]);
}
System.out.println("添加操作成功");
break;
case'2' :
System.out.println("请输入要插入的位置:");
int loc =sc.nextInt();
System.out.println("请输入要插入的位置的值:");
int num =sc.nextInt();
list.add(loc-1,num);
System.out.println("添加操作成功");
break;
case'3' :
System.out.println("请输入要删除的位置:");
loc =sc.nextInt();
list.remove(loc-1);
System.out.println("添加操作成功");
break;
case'4' :
System.out.println("请输入要查找元素:");
num =sc.nextInt();
System.out.println(num+"在列表当中的位置:"+(list.indexOf(num)+1));
break;
case'5' :
System.out.println("请输入要查找元素的位置:");
loc =sc.nextInt();
System.out.println(loc+"位置上的元素为"+list.get(loc-1));
//从0开始和从1开始的区别,所以要减一
break;
case'6' :
System.out.println("线性表中的元素有:");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i)+"");
}
System.out.println();
break;
}
} while ( ch !='0');
sc.close();
}
}
二、使用链表