顺序表操作验证

顺序表操作验证

一、实验目的
⑴ 掌握线性表的顺序存储结构;
⑵ 验证顺序表及其基本操作的实现;
⑶ 掌握数据结构及算法的程序实现的基本方法。
二、实验内容
⑴ 建立含有若干个元素的顺序表;
⑵ 对已建立的顺序表实现插入、删除、查找等基本操作。
三、设计与编码
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)程序运行的结果如何?(附上各种操作实现的运行截图)
查找操作截图
在这里插入图片描述
在这里插入图片描述

插入操作截图(有异常情况)
在这里插入图片描述

插入操作截图
在这里插入图片描述

清空操作截图
在这里插入图片描述

删除操作截图(有异常)
在这里插入图片描述

删除操作截图
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值