线性表的实现

要求:定义一个线性表要满足能够添加元素,插入元素,删除元素,定位元素,取表元素,取表长度,清空表等操作。
一、:使用顺序表实现


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();
	}
}

二、使用链表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Modify_QmQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值