线性表
2.1线性表的定义和特点
相同特性的数据元素的有限序列 (a1,a2,...,an) 元素性质必须相同,之间是线性关系 首节点没有前驱,尾节点没有后继 元素的数据类型可以是简单数据类型也可以是复杂数据类型
总结
-
线性表中的元素类型可以是简单数据类型,也可以是复杂类型
-
要从具体的应用中抽象出共性的逻辑结构和基本操作(抽象数据类型),然后实现其存储结构和基本操作
2.2线性表的顺序表示与实现
线性表定义如下
class List{ 数据对象(成员变量) 数据关系 基本操作(方法)...
} 基本操作1:
InitList()构造一个空的线性表
DestoryList()销毁线性表
ClearList()清空线性表
基本操作2:
ListEmpty()判断线性表是否为空
ListLength()获取线性表中的元素个数
基本操作3:
GetElement()获取线性表中的i个数据元素的值
LocateElem()查找元素e,返回数据元素的位置
基本操作4:
PriorElem()求当前元素的前驱元素
NextElem()求当前元素的后继元素
基本操作5:
ListInsert()在i处插入元素,1<=i<=List.length+1
插入后更新元素个数
基本操作6:
ListDelet()删除第i个元素1<=i<=List.length
删除后更新元素个数
ListTraverse()遍历线性表
逻辑和物理结构上都是相邻的,存储时需要占用连续的存储空间,中间不能空出存储单元。
优点:知道一个元素的地址可以找到其它元素的位置
数据类型:
public class SqList { private final int MAX_SIZE = 100;//顺序表的最大长度 int[] data;//存储数据的数组(可以保存各种数据) int length;//顺序表中的元素个数 }
操作方法:
/**
* 初始化顺序表
* 初始化操作,建立一个空的线性表
*/
public void initList(){
this.data = new int[MAX_SIZE];//初始化一个数组,长度为MAX_SIZE
if (this.data == null){
throw new OutOfMemoryError("内存分配失败!");
}
this.length = 0;//元素个数置0
}
/**
* 销毁线性表
*/
public void destroyList(){
if (this.length != 0){
this.data = null;
this.length = 0;
}
}
/**
* 清空线性表
*/
public void clearList(){
this.length = 0;
}
/**
* 获取顺序表长度
* @return 顺序表长度
*/
public int getLength(){
return this.length;
}
/**
* 判断顺序表是否为空
* @return b
*/
public boolean isEmpty(){
return this.length==0;
}
/**
* 返回第i个元素的值
* @param i 元素位置
* @return 元素值
*/
public int getElem(int i){
if (i>=1 && i<=this.length){
return this.data[i-1];
}else {
throw new RuntimeException("输入不合法");
}
}
在线性表L中查找与指定值e相同的数据元素的位置
/**
* 返回第i个元素的值
* @param i 元素位置
* @return 元素值
*/
public int getElem(int i){
if (i>=1 && i<=this.length){
return this.data[i-1];
}else {
throw new RuntimeException("输入不合法");
}
}
/**
* 在线性表L中查找与指定值e相同的数据元素的位置
* @param e 要查找的元素值
* @return 元素位置
*/
public int locateElem(int e){
//顺序查找
for (int i = 0; i < this.length; i++) {
if (e == this.data[i]){
return i+1;
}
}
return 0;
}
/**
* 随机插入元素
* @param i 插入位置
* @param data 插入数据
*/
public void insertElem(int i,int data){
if (this.length >100){//先判断空间是否满了
throw new RuntimeException("空间已满");
}
if (i<=0 || i>this.length+1){//再判断插入位置是否合法
throw new RuntimeException("输入不合法");
}
for (int j = this.length-1; j >= i-1 ; j--) {
this.data[j+1] = this.data[j];
}
this.data[i-1] = data;
this.length++;
}
/**
* 删除i处的元素
* @param i 元素的位置
*/
public void listDelete(int i){
if (this.length==0){
throw new RuntimeException("顺序表为空");
}
if (i<=0 || i>this.length){//再判断插入位置是否合法
throw new RuntimeException("输入不合法");
}
for (int j = i; j <= this.length-1 ; j++) {
this.data[i-1] = this.data[i];
}
this.length--;
}
/**
* 遍历顺序表
*/
public void listTraverse(){
for (int i = 0; i < this.length; i++) {
System.out.print(this.data[i] + " ");
}
}
测试
package linkedlist;
public class SqListTest {
public static void main(String[] args) {
SqList sqList = new SqList();
sqList.initList();
sqList.insertElem(1,1);
sqList.insertElem(1,2);
sqList.insertElem(1,3);
sqList.insertElem(1,4);
sqList.insertElem(1,5);
sqList.listTraverse();
System.out.println();
System.out.println(sqList.getElem(1));
System.out.println(sqList.locateElem(4));
System.out.println(sqList.isEmpty());
System.out.println(sqList.getLength());
sqList.listDelete(5);
sqList.listTraverse();
}
}