在计算机中线性表可以采用两种方式来保存,一种是顺序存储结构,另一种是链式存储结构,对于顺序存储结构的线性表称为顺序表(Sequential List),而链式存储的线性表称为链表,以下是我对顺序表结构的学习。
顺序表结构的优点:适用于追加,查询操作较多的数据存储,存储方式简单。
顺序表结构的缺点:在插入或者删除结点的时候,往往需要移动大量的数据。如果表比较大,有时还比较难分配足够的连续存储空间,即内存分配失败而无法存储。
对顺序表结构的设计分为以下几个步骤:
- 定义顺序表结构(SLType)
- 初始化顺序表(SLInit)
- 计算顺序表长度(SLLength)
- 追加结点(SLAdd)
- 插入结点(SLInsert)
- 删除结点(SLDelete)
- 查找/遍历结点(SLSelect)
代码实现:
一,定义结点
class Data { // 定义结点
String name;
String age;
}
二,顺序表结构设计
public class SList {
SLType SL;//定义全局引用,在初始化顺序表的时候会为引用赋值
class SLType { // 定义顺序表结构
static final int SLMAX = 20;// 顺序表的最大长度
Data[] data = new Data[SLMAX];
int SLLen;// 顺序表现有长度
}
void SLInit() {// 初始化顺序表
if ((SL = new SLType()) != null) {
SL.SLLen = 0;
}
}
int SLLength() {// 计算顺序表长度
return SL.SLLen;
}
int SLAdd(Data d) {// 追加数据
if (SL.SLLen >= SL.SLMAX) {
System.out.println("顺序表数据已满");
return 0;
}
SL.data[SL.SLLen++] = d;//在顺序表尾部添加数据,且顺序表长度增一
return 1;
}
int SLInsert(int n, Data d) {// 插入数据(插入结点号,插入数据对象)
if (SL.SLLen >= SL.SLMAX) {//数据溢出
System.out.println("顺序表数据已满");
return 0;
}
if (n < 1 || n > SL.SLLen) {//保证数据插入位置有效
System.out.println("输入结点号错误");
return 0;
}
for (int i = SL.SLLen; i >= n; i--) {
SL.data[i] = SL.data[i - 1];
}
SL.data[n - 1] = d;//输入结点从1开始,程序索引从0开始,故插入位置为n-1
SL.SLLen++;//数据插入成功,顺序表长度增一
return 1;
}
int SLDelete(int n) {// 删除数据结点
if (n < 1 || n > SL.SLLen) {
System.out.println("输入结点号错误");
return 0;
}
for (int i = n - 1; i < SL.SLLen - 1; i++) {
SL.data[i] = SL.data[i + 1];
}
SL.SLLen--;//数据删除成功,顺序表长度减一
return 1;
}
Data SLSelectByNum(int n) {// 结点查询数据
if (n < 1 || n > SL.SLLen) {
System.out.println("输入结点号错误");
return null;
}
return SL.data[n - 1];
}
void SLSelectAll(){//遍历查询所有数据
if(SL.SLLen==0){
System.out.println("数据表为空");
}
for(int i=0;i<SL.SLLen;i++){
System.out.println("姓名:"+SL.data[i].name+"|"+"年龄:"+SL.data[i].age);
}
}
}
三,运行测试
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
SList sList = new SList();
sList.SLInit();
while (true) {
System.out.println("请输入:0(退出),1(添加信息),2(插入信息),3(查询所有信息),4(删除信息)");
int i = in.nextInt();
switch (i) {
case 0:
System.out.println("已退出");
return;
case 1:
Data d=new Data();
System.out.print("插入姓名:");
String name=in.next();
System.out.print("插入年龄:");
String age=in.next();
if(name==null||age==null){
System.out.println("信息不能为空");
break;
}
d.age=age;
d.name=name;
int temp1=sList.SLAdd(d);
if(temp1==0){
System.out.println("插入失败");
}System.out.println("插入成功");
break;
case 2:
Data d2=new Data();
System.out.print("插入姓名:");
String name2=in.next();
System.out.print("插入年龄:");
String age2=in.next();
if(name2==null||age2==null){
System.out.println("信息不能为空");
break;
}
System.out.print("插入结点号:");
int n=in.nextInt();
d2.age=age2;
d2.name=name2;
int temp2=sList.SLInsert(n, d2);
if(temp2==0){
System.out.println("插入失败");
break;
}System.out.println("插入成功");
break;
case 3:
sList.SLSelectAll();
break;
case 4:
System.out.print("删除结点号:");
int n4=in.nextInt();
int temp4=sList.SLDelete(n4);
if(temp4==0){
System.out.println("删除失败");
break;
}System.out.println("删除成功");
break;
default:
break;
}
}
}