定义线性表接口
public interface IListDS<T>{
int Count(); //求长度
void Clear();//清空操作
boolean IsEmpty();//判断线性表是否为空的操作
boolean IsFull();
void Append(T item);//附加操作
void Insert(T item,int i);//插入操作
T Delete(int i);//删除操作
T GetElem(int i);//取表元操作
int Locate(T value);//按值查找操作
}
顺序表实现
public class SeqList<T> implements IListDS<T> {
public T[] data; // 将数组的元素存放到线性表中
public int last; // 线性表中最后一个元素的位置
public int maxsize; // 线性表的容量
public void SeqList(int size ){//创建一个顺序表类
if (size>0){
data = (T[]) new Object[size];
this.maxsize=size;
last=-1;
}
else
throw new RuntimeException("初始化容量必须大于零");
}
@Override
public int Count() {
return last + 1;
}
@Override
public void Clear() {
last = -1;
}
@Override
public boolean IsEmpty() {
return last == -1;
}
@Override
public boolean IsFull() {
return last == maxsize - 1;
}
@Override
public void Append(T item) {
if (last == maxsize-1){
throw new RuntimeException("线性表已满,无法附加!");
}
data[++last] = item;
}
@Override
public void Insert(T item, int i) {
if (last==maxsize-1){
throw new RuntimeException("线性表已满,无法插入");
}
if (i<1||i>last+2){
throw new RuntimeException("插入位置错误");
}
// 元素移动
for (int a=last;a>=i-1;--a){
data[a+1] = data[a];
}
// 插入
data[i-1]= item;
// 修改表长
++last;
}
@Override
public T Delete(int i) {
T tmp;
// 判断表是否为空
if (last==-1){
throw new RuntimeException("线性表为空,无法删除");
}
if (i<1||i>last+1){
throw new RuntimeException("无效的下标"+i);
}
tmp = data[i - 1];
for (int j= i;j<=last;++j){
data[j-1]=data[j];
}
// 元素移动
--last;
return tmp;
}
@Override
public T GetElem(int i) {
if (IsEmpty()){
throw new RuntimeException("线性表为空,无法获取元素");
}
if (i < 1 || i > last + 1){
throw new RuntimeException("无效的下标"+ i);
}
return data[i - 1];
}
@Override
public int Locate(Object value) {
if (IsEmpty()){
return -1;
}
int i = 0;
for (i = 0;i<=last;++i){
if (data[i].equals(value)){
break;
}
}
if (i>last){
return -1;
}
return i+1;
}
}
案例:
请编制 java程序,利用顺序存储方式来实现下列功能:
(1)主函数中定义一个数组a[8]={12,32,43,55,34,76,81,59},建立一个顺序表,将数组a存储到顺序表中,并输出该顺序表中的数据以及该顺序表的长度;
(2)对(1)中建立的顺序表进行数据的插入、删除、查找(包括按值查找和按位查找),并在插入或删除数据后再输出顺序表中的数据。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
SeqList<Integer> seqList = new SeqList<>();
seqList.SeqList(12);
int[] a = {12, 32, 43, 55, 34, 76, 81, 59};
for (int i = 0; i < a.length; ++i) {
seqList.Append(a[i]);
}
for (int i = 1; i <= seqList.Count(); ++i) {
System.out.println("顺序表第" + i + "个元素为:" + seqList.GetElem(i));
}
System.out.println("表中一共有" + seqList.Count() + "个元素");
// 插入操作:
System.out.println("输入要插入的数字:");
int num = sc.nextInt();
System.out.println("输入要插入的位置:");
int index = sc.nextInt();
seqList.Insert(num, index);
System.out.println("插入成功,展示数据:");
for (int i = 1; i <=seqList.Count(); ++i) {
System.out.println("第"+i+"个元素为:"+seqList.GetElem(i));
}
// 删除操作
System.out.println("请输入你要删除的位置:");
int p = sc.nextInt();
seqList.Delete(p);
System.out.println("删除成功,接下来开始输出顺序表数据");
for (int i=1;i<=seqList.Count();++i){
System.out.println("顺序表中第"+i+"个元素是:"+seqList.GetElem(i));
}
//按值查找操作
System.out.println("请输入你要查找的数字:");
int num2 = sc.nextInt();
seqList.Locate(num2);
if (seqList.Locate(num2) == -1){
System.out.println("顺序表内没有你要查找的数字");
}
else
System.out.println("顺序表中第"+seqList.Locate(num2)+"个元素是你要寻找的数字");
//按位查找操作
System.out.println("请输入你要查找的位置:");
int num3 = sc.nextInt();
seqList.GetElem(num3);
System.out.println("顺序表中第"+num3+"个元素是你要寻找的"+seqList.GetElem(num3)+"数字");
}
}