数据结构重温之顺序表
什么是顺序表
顺序表就是按照顺序存储方式存储的线性表,该线性表的结点按照逻辑次序依次存放在计算机的一组连续的存储单元中。
由于顺序表是依次存放的,只要知道了该顺序表的首地址及每个数据元素所占用的存储长度,那么就很容易计算出任何一个数据元素(即数据结点)的位置。
一般的,假设顺序表中所有结点的类型相同,则每个结点所占用的存储空间大小亦相同,每个结点占用c个存储单元。其中第一个单元的存储地址则为该结点的存储地址,并设顺序表中开始结点a1的存储地址为LOC(a1),那么结点ai的存储地址LOC(ai)可通过下式计算:
LOC(ai) = LOC(a1) + (i - 1) * c 1≤ i ≤ n
下面为顺序表的基本操作的代码。
import java.util.Scanner;
class Data {
String key ;
String name;
int age;
}
public class SLType {
static final int MAXLENGTH = 100;
Data [] listData = new Data[MAXLENGTH+1];
int listLen;
/**
* 初始化
* @param sl
*/
void SLInit(SLType sl){
sl.listLen = 0;
}
/**
* 获取顺序表的长度
* @param sl
* @return
*/
int SLLength(SLType sl){
return sl.listLen;
}
/**
* 向表中插入数据
* @param sl
* @param n
* @param data
* @return
*/
int SLInsert(SLType sl,int n, Data data){
int i ;
if (sl.listLen>=MAXLENGTH) {
System.out.println("顺序表已满,不能插入节点!\n");
return 0;
}
if (n<1 || n>sl.listLen-1) {
System.out.println("插入元素序号错误,不能插入元素!\n");
return 0;
}
for (i = sl.listLen; i >= n; i--) {
sl.listData[i+1] = sl.listData[i];
}
sl.listData[n] = data;
sl.listLen++;
return 1;
}
/**
* 向表的末尾追加数据
* @param sl
* @param data
* @return
*/
int SLAdd(SLType sl , Data data){
if (sl.listLen >=MAXLENGTH) {
System.out.println("顺序表已满,不能再添加节点了!\n");
return 0;
}
sl.listData[++sl.listLen] = data;
return 1;
}
/**
* 删除指定位置的节点数据
* @param sl
* @param n
* @return
*/
int SLDelete(SLType sl , int n){
int i ;
if (n<1 || n>sl.listLen+1) {
System.out.println("删除节点序号错误,不能删除节点!\n");
return 0;
}
for (i = n; i < sl.listLen; i++) {
sl.listData[i] = sl.listData[i+1];
}
sl.listLen --;
return 1;
}
/**
* 查找指定节点数据
* @param sl
* @param n
* @return
*/
Data SLFindByNum(SLType sl, int n){
if (n<1 || n>sl.listLen+1) {
System.out.println("节点序号错误,不能返回节点!\n");
return null;
}
return sl.listData[n];
}
/**
* 按照关键字查找节点
* @param sl
* @param key
* @return
*/
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;
}
/**
* 显示所以节点
* @param sl
* @return
*/
int SLAll(SLType sl){
int i ;
for (i = 1; i <= sl.listLen; i++) {
System.out.printf("(%s,%s,%d)\n",sl.listData[i].key,sl.listData[i].name
,sl.listData[i].age);
}
return 0;
}
public static void main(String[] args) {
int i;
SLType sl = new SLType();
Data pdata ;
String key;
System.out.println("顺序表操作演示!");
sl.SLInit(sl);
System.out.println("初始化顺序表完成");
Scanner input = new Scanner(System.in);
do {
System.out.println("输入添加的结点(学号 姓名 年龄):");
Data data = new Data();
data.key = input.next();
data.name = input.next();
data.age = input.nextInt();
if (data.age!=0) {
if (sl.SLAdd(sl, data)==0) {
break;
}
}else{
break;
}
} while (true);
System.out.println("顺序表中的结点顺序为:\n");
sl.SLAll(sl);
System.out.println("\n要取出的结点的序号:");
i = input.nextInt();
pdata = sl.SLFindByNum(sl, i);
if (pdata != null) {
System.out.printf("第%d个结点为:(%s,%s,%d)\n",i,pdata.key,pdata.name,pdata.age);
}
System.out.println("\n要查找结点的关键字:");
key = input.next();
i = sl.SLFindByCont(sl, key);
pdata = sl.SLFindByNum(sl, i);
if (pdata != null) {
System.out.printf("第%d个结点为:(%s,%s,%d)\n",i,pdata.key,pdata.name,pdata.age);
}
input.close();
}
}