实现的操作包括:
辅助实现的操作包括:
下面是实现的代码(SeqList)
/**
* 该顺序表实现仅针对不存在相同元素的集合
* 若集合中存在相同元素,则:
* 方法 deleteDataByData(Type):删除第一个满足要求的数据。
* 方法 findLocationOfData(Type):返回查找到的满足要求的第一个数据的地址。
*/
public class SeqList {
/**
* 定义数据结构
*/
private static final int MAXSIZE = 100;//顺序表的最大长度
private int size;//顺序表中的节点数
Type[] dataList;//保存节点类型为 Type 的数组
/**
* 默认构造方法
*/
public SeqList(){
dataList = (Type[]) new Object[MAXSIZE];
this.size = 0;
}
/**
* 根据指定数组构造顺序表(未调通)
* @param dataList:指定的数组
*/
public SeqList(Type[] dataList){
this.dataList = dataList;
this.size = dataList.length;
}
/**
* 构造指定大小的顺序表
* @param size:指定的大小
*/
public SeqList(int size){
dataList = (Type[]) new Object[size];
this.size = 0;
}
/**
* 获取顺序表的大小
* @return size:顺序表大小
*/
public int getSize(){
return this.size;
}
/**
* 清空顺序表
*/
public void clear(){
this.dataList = null;
this.size = 0;
}
/**
* 向顺序表末尾添加节点 data
* @param data:新添加的节点
* @return -1:顺序表满,添加失败
* 0:添加成功
*/
public int addData(Type data){
if (this.size == MAXSIZE) {//首先判断顺序表是否已满
//System.out.println("顺序表已满!");
return -1;
}
dataList[size++] = data;
//顺序表未满,则将新数据添加到顺序表末尾。
// 同时顺序表大小递增 1
return 0;
}
/**
* 向指定位置插入节点 data
* @param data:新插入的数据
* @param loc:插入的位置
* @return -1:位置超出范围或顺序表满,插入错误
* 0:插入成功
*/
public int insertDataByLoc(Type data, int loc){
if ((size == MAXSIZE)){
//System.out.println(" 顺序表已满!");
return -1;
}else if ((loc >= MAXSIZE)){
//System.out.println(" 指定位置过大!请指定 " + MAXSIZE + " 以内的位置!");
return -1;
} else if (loc < 0){
//System.out.println(" 指定位置不正确!位置不能为负数!");
return -1;
} else if (loc >= size){
addData(data);
//System.out.println(" 指定位置超过当前顺序表最后一个节点的位置!\n 已将当前数据插入到顺序表最后!");
return 0;
}else if (size == 0) {
dataList[0] = data;
return 0;
}else {
for (int i = size-1; i >= loc; i--) {
//将 loc 往后的节点都向后移动一个位置
dataList[i+1] = dataList[i];
}
dataList[loc] = data;//将新数据插入到指定位置
this.size += 1;//将顺序表大小递增 1
return 0;
}
}
/**
* 删除指定元素,并返回删除元素的位置
* @param data:需要删除的数据
* @return i:删除数据的位置
* -1:没有找到指定的元素
*/
public int deleteDataByData(Type data){
for (int i = 0; i < this.size; i++) {
if (dataList[i].equals(data)) {
deleteDataByLoc(i);
return i;
}
}
return -1;
}
/**
* 删除指定位置的数据
* @param loc:数据的位置
* @return 删除掉的数据值
*/
public Type deleteDataByLoc(int loc){
Type data = findDataByLoc(loc);//将 loc 处的数据保存下来
if (data == null)//数据为空
return null;
for (int i = loc; i < this.size; i++) {
//将 loc 往后的数据顺序地往前移动一个位置
dataList[i] = dataList[i+1];
}
this.size --;//将顺序表大小递减 1
return data;
}
/**
* 查找指定位置的数据
* @param loc:数据的位置
* @return 指定位置的数据值
*/
public Type findDataByLoc(int loc){
if ((loc > this.size) || (loc < 0) || (dataList == null))
return null;
return dataList[loc];
}
/**
* 查找指定数据的位置
* @param data:需要查找的数据
* @return loc:数据的位置
*/
public int findLocationOfData(Type data){
for (int i = 0; i < this.size; i++) {
//查找指定数据
if (dataList[i].equals(data)) {
return i;
}
}
return -1;
}
/**
* 判断顺序表是否为空
* @return 顺序表是否为空
*/
public boolean isEmpty(){
//好奇一件事,为什么使用 if(dataList == null) 得到的结果是错的?
//下面的实现是暴力实现,慎用!!!
// if ((dataList == null) || (dataList.length == 0))
// return true;
// return false;
for (int i = 0; i < dataList.length; i++) {
if (dataList[i] != null)
return false;
}
return true;
}
/**
* 打印顺序表数据
*/
public void display(){
for (int i = 0; i < this.size; i++) {
System.out.print(" " + dataList[i]);
}
}
}
下面是该代码的测试代码(SeqListTest)
public class SeqListTest {
private int[] dataList = new int[10];
private static final int SIZE = 20;
private static final int MULTI = 3;
/**
* 程序的 main() 方法
* @param args
*/
public static void main(String[] args) {
SeqListTest s = new SeqListTest();
s.run();
}
/**
* 运行程序
*/
public void run(){
//首先构造数据列表
for (int i = 0; i < dataList.length; i++) {
dataList[i] = (i+1);
}
SeqList seqDataList = new SeqList<>();
if (seqDataList.isEmpty())//测试 isEmpty() 方法
System.out.println("顺序表为空。");
for (int i = 0; i < SIZE; i++) {//测试 addData() 方法
seqDataList.addData((i * MULTI));
}
// 测试 findDataByLoc() 方法
display(seqDataList);
//测试 insertDataByLoc() 方法
System.out.println("在位置 -3 处添加数据:10");
seqDataList.insertDataByLoc(10,-3);
System.out.println("在位置 3 处添加数据:10");
seqDataList.insertDataByLoc(10,3);
System.out.println("在位置 23 处添加数据:10");
seqDataList.insertDataByLoc(10,23);
System.out.println("在位置 103 处添加数据:10");
seqDataList.insertDataByLoc(10,103);
display(seqDataList);
//测试 deleteDataByData() 方法
System.out.println("删除数据:3");
seqDataList.deleteDataByData(3);
System.out.println("删除数据:5");
seqDataList.deleteDataByData(5);
display(seqDataList);
//测试 deleteDataByLoc() 方法
System.out.println("删除位置:-6 的数据");
seqDataList.deleteDataByLoc(-6);
System.out.println("删除位置:6 的数据");
seqDataList.deleteDataByLoc(6);
System.out.println("删除位置:26 的数据");
seqDataList.deleteDataByLoc(26);
display(seqDataList);
//测试 findLocationOfData() 方法
System.out.println("删除元素:15");
seqDataList.deleteDataByData(15);
System.out.println("删除元素:105");
seqDataList.deleteDataByData(105);
display(seqDataList);
//测试 findLocationOfData() 方法
System.out.println("查找元素:10 的位置:" + seqDataList.findLocationOfData(10));
System.out.println("查找元素:-1 的位置:" + seqDataList.findLocationOfData(-1));
//测试 clear() 方法
seqDataList.clear();
display(seqDataList);
}
private void display(SeqList seqDataList){
System.out.println("顺序表中的数据为:");
for (int i = 0; i < seqDataList.getSize(); i++) {
System.out.print(" " + seqDataList.findDataByLoc(i));
}
System.out.println("\n顺序表大小为:" + seqDataList.getSize());
System.out.println();
}
}
因为很久没写代码,所以写得比较乱,还望谅解~/bq