一、线性表及其基本操作
1、 线性表的特点:
1)除第一个元素外,其他每一个元素有一个且仅有一个直接前驱
2)除最后一个元素外,其他每一个元素有一个且仅有一个直接后继
3)原则上讲,线性表中表元素的数据类型可以不相同。但采用的存储表示可能会对其有限制
2、 线性表的抽象数据类型
package 线性表;
public interface IList {
//清空线性表
public void clear();
//判断线性表是否为空
public boolean isEmpty();
//返回线性表的长度
public int length();
//返回第i个元素
public Object getObject(int index) throws Exception;
//插入x作为第i个元素
public void insert(int index, Object o) throws Exception;
//删除第i个元素并返回被删除对象
public Object delete(int index) throws Exception;
//返回x对应的元素位置
public int getIndex(Object o);
//输出线性表
public void print();
}
二、 线性表的顺序存储及其实现
1、 基本知识点
- 定义:将线性表中的元素相继存放在一个连续的存储空间中。可利用一维数组作为其存储结构。
限制:所有的数据类型都应该相同 - 特点:
1)在线性表上逻辑上相邻的数据元素,在物理存储位置上也是相邻的
2)便于随机存取
3)不便于在顺序表上插入和删除,因为插入和删除回事大量数据元素产生位置的移动(两个特点都是因为索引带来的方便之处和不便之处)
4)存储密度高,存储密度=(数据元素本身需要的存储空间)/(该数据元素实际所占用的空间)
2、顺序表类的描述
- 基本方法
package 线性表;
//顺序表类的描述
public class SqList implements IList{
private Object[] ListElem; //线性表的存储空间
private int length; //线性表的长度
//构造函数
public SqList(int maxsize) {
//maxsize在这里指的是线性表的最大容量
length = 0; //初始化线性表的长度为0
ListElem = new Object[maxsize]; //为线性表分配存储单元
}
@Override
public void clear() {
//清除就是把当前顺序表的长度定义为0
length = 0;
}
@Override
public boolean isEmpty() {
//通过判断顺序表的长度是否为0
return length == 0;
}
@Override
public int length() {
return length;
}
@Override
public void print() {
for(int i = 0 ; i <length ; i++) {
System.out.print(ListElem[i]+" ");
}
}}
- 插入操作
@Override
/*
* 先判断线性表是否已满
* 后判断插入的位置是否合理
* 再将插入位置后面的元素往后移动
* 插入位置
* 让线性表当前的长度自增
*/
public void insert(int index, Object o) throws Exception {
if (length == ListElem.length) {
throw new Exception("顺序表已满");
}
if(index < 0 || index > length) {
throw new Exception("index无效");
}
for(int i = length; i > index ; i--) {
ListElem[i] = ListElem[i-1];
}
ListElem[index] = o;
length++;
}
- 删除操作
@Override
/*
* 首先判断删除的位置是否合理
* 然后将删除的元素位置后的元素往前挪
* 最后将list当前的长度减去1
*/
public Object delete(int index) throws Exception {
if(index < 0 || index >= length) {
throw new Exception("index无效");
}
Object s = ListElem[index];
for(int i = index; i < length