顺序表就是按照顺序存储方式存储的线性表,该线性表的结点按照逻辑次序一次存放在计算机的一组连续的存储单元中如下图:
由于顺序表是一次存放的,只要知道了该顺序表的首地址以及每个数据元素所占用的存储长度,那么我们就很容易计算出任何一个数据元素(也就是数据系结点)的位置。
1、结点数据类型:
public class MySeqNode {
String key; //关键字
String name;
int age;
public MySeqNode(String key, String name, int age) {
this.key = key;
this.name = name;
this.age = age;
}
}
2、顺序表的类:
/**
* 顺序表的实现
* @author Administrator
*
*/
public class MySequence {
/**
* 规定顺序表的最大长度为10
*/
private static final int MAXLEN=10;
/**
* 保存顺序表的结构数组
*/
public MySeqNode[] mySeq=new MySeqNode[MAXLEN+1];
/**
* 已存结点的数量
*/
private int seqLen;
}
3、初始化顺序表
创建一个空的顺序表,也就是初始化顺序表,只需要将表的结点数量listlen设为0即可,这样如果顺序表中原来已有数据,后面添加的数据元素将从顺序表的第一个位置存储,也会覆盖已有数据。
/**
* 初始化顺序表,即创建空的顺序表
*/
public void initMySequence(MySequence mySequence){
mySequence.seqLen=0;
}
4、计算顺序表长度
计算顺序表长度也就是计算顺序表中结点的个数。
/**
* 获取数序表长度,即已存节点的数量
* @return
*/
public int getMySeqLen(MySequence mySequence){
return mySequence.seqLen;
}
5、插入结点是在顺序表的第i个位置上插入一个新的结点,使得其后的结点编号依次加1。这时候顺序表的长度便为n+1。插入的结点之后的结点都要向后移动。
/**
* 插入结点,成功返回1,否则返回0
* @param mySeqNode 要插入的结点
* @param n 要插入的结点的位置
* @return
*/
public int insertSeq(MySequence mySequence,MySeqNode mySeqNode,int n){
if (seqLen>=MAXLEN) {
System.out.println("数序表已满,不可以插入结点!");
return 0;
}
if(n<1||n>seqLen-1){
System.out.println("插入结点的位置不对,不可以插入!");
return 0;
}
for(int i=seqLen;i>=n;i--){
mySeq[i+1]=mySeq[i];//n位置插入结点,那么n位置以后的结点都要向后移动,先从最后一个结点开始移动,一直到第n个结点
}
mySequence.mySeq[n]=mySeqNode; //插入结点
mySequence.seqLen++; //顺序表结点个数增加1,即长度+1
return 1;
}
6、追加节点
在顺序表的末尾来新增加一个加一个节点。不需要大量数据移动,只需要结点个数即长度+1.
/**
* 追加结点
* @param mySeqNode 要追加的结点
* @return
*/
public int appendSeq(MySequence mySequence,MySeqNode mySeqNode){
if (seqLen>=MAXLEN) {
System.out.println("数序表已满,不可以插入结点!");
return 0;
}
mySequence.mySeq[++seqLen]=mySeqNode;
return 1;
}
7、删除结点
删除结点是删除顺序表L的第i个结点,使其后的所有结点编号依次减1。删除节点,长度-1,删除节点之后的结点都需要向前移动。
/**
* 删除某一个位置上的结点
* @param mySequence
* @param n
* @return
*/
public int delSeqNode(MySequence mySequence,int n){
if (n<1||n>mySequence.seqLen+1) {
System.out.println("删除位置错误,不可删除结点。");
return 0;
}
for (int i = n; i < mySequence.seqLen; i++) {
mySequence.mySeq[i]=mySequence.mySeq[i++];//n以后的位置向前移动
}
mySequence.seqLen--;
return 1;
}
8、查找结点
(1)、根据位置i查找结点
/**
* 根据序列号返回结点
* @param mySequence
* @param n
* @return
*/
public MySeqNode getNodeByNum(MySequence mySequence,int n){
if (n<1||n>mySequence.seqLen+1) {
System.out.println("结点序号错误,不能返回节点!");
return null;
}
return mySequence.mySeq[n];
}
(2)、根据关键字查找结点
/**
* 根据关键字返回结点序列号
* @param mySequence
* @param key
* @return
*/
public int getNodeByKey(MySequence mySequence,String key){
for (int i = 0; i < mySequence.seqLen; i++) {
if ((mySequence.mySeq[i].key).equals(key)) {
return i;
}
}
return 0;
}
9、显示所有结点:
/**
* 遍历所有的结点
*/
public void listSeq(MySequence mySequence){
for (int i = 0; i < mySequence.seqLen; i++) {
System.out.println("顺序表中的结点为:"+mySequence.mySeq[i].key+","+mySequence.mySeq[i].name+","+mySequence.mySeq[i].age);
}
}
顺序表缺点:
1、在插入或者删除结点时,需要移动大量的数据。
2、如果表比较大,有时会比较男分配足够的连续的存储空间,往往导致内存分配失败,而无法存储。