顺序表操作验证
一、实验目的
⑴ 掌握线性表的顺序存储结构;
⑵ 验证顺序表及其基本操作的实现;
⑶ 掌握数据结构及算法的程序实现的基本方法。
二、实验内容
⑴ 建立含有若干个元素的顺序表;
⑵ 对已建立的顺序表实现插入、删除、查找等基本操作。
三、设计与编码
1)本实验用到的理论知识
顺序表是用一段地址连续的存储单元依次存储线性表的数据元素,通过算法来实现对线性表的增、删、减、查。
顺序表的数据类型定义如下:
public class shishi {
private int MAX_SIZE = 10;
private int capacity;
private Object[] elementData;
private int size = 0;
}
2)算法设计
先建立一个顺序表,再运用遍历算法、按位查找算法、按位插入算法、删除操作等来实现增、删、减、查。
用自然语言或流程图的方式描述下列基本操作的算法步骤:
① 插入
1)先判断插入位置的索引i是否合法或者越界,若不合法则提出相应的提示。
2)将第n个至第i个元素的位置依次向后移动一个位置,空出来的第i个位置(i=n+1)则无需移动。
3)将要插入的新元素e放到第i个位置上
4)表长要加1
② 按值查找
根据指定值data,从i=0开始遍历数组,最终没有发现data值则返回-1,有发现则返回数组下标i
③ 删除(删除指定位置的元素)
1)判断删除位置的索引i是否合法或越界,若不合法则有相应的提示信息。
2)将第i+1个至第n个元素依次向前移动一个位置(i=n时则无需移动)
3)表长相应减1
④ 删除(删除指定值的元素)
1)调用查找方法遍历数组,与所给出的data值进行判断,若相同则返回下标i同时进行删除操作,将第i+1个至第n个元素依次向前移动一个位置(i=n则无需移动)。若没有发现要删除指定的那个值则提示没有此指定值。
3)编码
将算法转化为c程序或Java程序。(附源程序)
package shuju;
public class shishi {
private int MAX_SIZE = 10;
private int capacity;
private Object[] elementData;
private int size = 0;
public shishi() {
capacity = MAX_SIZE;
elementData = new Object[capacity];
}
//初始化
public shishi(int element) {
this();
elementData[0] = element;
size++;
}
//定长
public shishi(E element ,int initsize) {
capacity = 1;
while(capacity < initsize) {
capacity <<= 1;
}
elementData = new Object[capacity];
elementData[0] = element;
size++;
}
public int length() {
return size;
}
public E getData(int i) {
if(i<0 || i>size) {
throw new IndexOutOfBoundsException("索引越界");
}
return (E) elementData[i];
}
//查找
public int search(E data) {
for(int i = 0;i < size;i++) {
if(elementData[i] == data) {
return i;
}
}
System.out.println("没有找到");
return -1;
}
//插入
public void insert(E data,int index) {
if(index < 0 || index >size) {
throw new IndexOutOfBoundsException("索引越界");
}
if(size > MAX_SIZE) {
System.out.println("顺序表中元素个数已达上限,不能再插入数据");
return;
}
//插入操作
System.arraycopy(elementData, index, elementData, index+1, size-index);
elementData[index] = data;
size++;
}
//末尾插入
public void addlast(E data) {
insert(data,size);
}
//删除
public void delete(int index) {
if(index < 0 || index >size) {
throw new IndexOutOfBoundsException("线性表索引越界");
}
E e = (E)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 static void main(String[] args) {
shishi<String> stringstr = new shishi<String>();
stringstr.addlast("111");
stringstr.addlast("222");
stringstr.addlast("333");
stringstr.addlast("555");
stringstr.insert("444", 0);
stringstr.insert("444", 5);
stringstr.delete(0);
for(int i=0;i<stringstr.length();i++) {
System.out.print(stringstr.getData(i)+" ");
}
System.out.println();
System.out.println("元素“111”在顺序表中的下标为 :"+stringstr.search("111"));
}
stringstr.makeEmpty();
for(int i=0;i<stringstr.length();i++) {
System.out.print(stringstr.getData(i)+" ");
}
System.out.println("empty");
}
}
四、运行与调试
a)在调试程序的过程中遇到什么问题,是如何解决的?
答:Java的一些基本语法不是很记得,重新复习Java相关知识,比如范式之类的,然后有些语法不太清楚。解决办法:上网看例子,看明白。把要实现的功能画出来,更好的理解,然后解决。
b)设计了哪些测试数据?测试结果是什么?(不要照抄老师课堂上的样例数据,用你自己设计的数据,评改时如发现数据一模一样,当结伴抄袭处理。理解透彻的同学,最好连运行输出的界面也有所改变,但要求清晰)
答:对于插入操作public void insert(E data,int index),设置的测试数据有:
Data:“444”index:2
Data:“6666”index:-2(索引越界)
Data:“444”index:0
Data:“444”index:11(索引越界)
对于删除操作public void delete(int index),设置的测试数据有:
Index:0
对于清空操作public void makeEmpty()。
c)程序运行的结果如何?(附上各种操作实现的运行截图)
查找操作截图
插入操作截图(有异常情况)
插入操作截图
清空操作截图
删除操作截图(有异常)
删除操作截图