顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
代码如下
import java.util.Scanner;
class DATA{
String key; //结点的关键字
String name;
int age;
}
class SLType{ //定义顺序表结构
static final int MAXLEN = 100;
DATA[] ListData = new DATA[MAXLEN+1]; //保存顺序表的结构数组
int ListLen; //顺序表已存结点的数量
void SLInit(SLType SL){ //初始化顺序表
SL.ListLen = 0; //初始化为空表
}
int SLLength(SLType SL){
return SL.ListLen; //返回顺序表的元素数量
}
int SLInsert(SLType SL,int n,DATA data){
int i;
if(SL.ListLen >= MAXLEN){
System.out.println("顺序表已满,不能插入结点!");
return 0;
}
if(n < 1 || n > SL.ListLen - 1){
System.out.println("插入元素序号错误,不能插入元素!");
return 0;
}
for(i = SL.ListLen;i >= n;i--){
SL.ListData[i+1] = SL.ListData[i];
}
SL.ListData[n] = data; //插入结点
SL.ListLen++; //顺序表结点数量加1
return 1;
}
int SLAdd(SLType SL,DATA data){ //增加元素到顺序表尾部
if(SL.ListLen >= MAXLEN){
System.out.println("顺序表已满,不能再添加结点!");
return 0;
}
SL.ListData[++SL.ListLen] = data;
return 1;
}
int SLDelete(SLType SL,int n){ //删除顺序表中的元素
int i;
if(n < 1 || n > SL.ListLen + 1){
System.out.println("删除结点序号错误,不能删除结点!");
return 0;
}
for(i = n;i < SL.ListLen;i++){
SL.ListData[i] = SL.ListData[i+1];
}
SL.ListLen--;
return 1;
}
DATA SLFindByNum(SLType SL,int n){ //根据结点序号查找结点
if(n < 1 || n > SL.ListLen + 1){
System.out.println("结点序号错误,不能返回结点!");
return null;
}
return SL.ListData[n];
}
int SLFindByCont(SLType SL,String key){ //根据关键字查找结点
int i;
for(i = 1;i <= SL.ListLen;i++){
if(SL.ListData[i].key.compareTo(key) == 0){
return i;
}
}
return 0;
}
int SLALL(SLType SL){ //显示所有结点
int i;
for(i = 1;i <=SL.ListLen;i++){
System.out.println(SL.ListData[i].key+","+SL.ListData[i].name+","+SL.ListData[i].age);
}
return 0;
}
}
public class 顺序表 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int i;
SLType SL = new SLType(); //定义顺序表变量
DATA pdata; //定义结点保存引用变量
String key; //保存关键字
System.out.println("顺序表操作演示!");
SL.SLInit(SL); //初始化
System.out.println("初始化顺序表完成!");
Scanner sc = new Scanner(System.in);
do{ //循环添加结点数据
System.out.print("请输入添加的结点(学号 姓名 年龄)");
DATA data = new DATA();
data.key = sc.next();
data.name = sc.next();
data.age = sc.nextInt();
if(data.age != 0){ //若年龄不为0
if(SL.SLAdd(SL,data) == 0){ //若添加结点失败 退出循环
break;
}
}else{ //当年龄输入为0时退出添加
break;
}
}while(true);
System.out.println("顺序表中的结点顺序为:");
SL.SLALL(SL);
System.out.println("要取出结点的序号:");
i = sc.nextInt();
pdata = SL.SLFindByNum(SL, i);
if(pdata != null){
System.out.println("第"+i+"个结点为:"+pdata.key+","+pdata.name+","+pdata.age);
}
System.out.println("要查找的结点的关键字");
key = sc.next();
i = SL.SLFindByCont(SL, key);
pdata = SL.SLFindByNum(SL, i);
if(pdata != null){
System.out.println("第"+i+"个结点为:"+pdata.key+","+pdata.name+","+pdata.age);
}
}
}
运行结果