线性表是存储顺序牌类的数据时最常用的数据结构。
实现线性表有两种方式。第一种是使用数组存储线性表的元素。数组是动态创建的。超过数组的容量时,创建一个
新的更大的数组,并且将当前数组中的元素复制到新建的数组中。另一种方法是用链表结构实现。链表由节点组成,每
个结点都是动态生成的,用来存储一个元素。所有的结点连接成一个线性表。
对于线性表的主要操作有:
1、提取线性表的元素
2、在线性表中插入一个新元素
3、从线性表中删除一个元素
4、获取线性表中元素的个数
5、查找线性表中是否包含某个元素
6、判断线性表是否为空
下面这个接口类定义了常用的操作。
package com.ezreal; public interface ListIntf {
/**
* 返回表长度
* @return
*/
public int size(); /**
* 增加元素
* @param obj
*/
public void add(Object obj);
/**
* 重置为空表
*/
public void clear();
/**
* 判断是否为空
* @return
*/
public boolean isEmpty();
/**
* 第i个数据元素的值
* @param i
* @return
*/
public Object get(int i);
/**
* 返回第一个这个元素的位置
* @param obj
* @return
*/
public int indexOf(Object obj);
/**
* 返回这个元素的前驱
* @param obj
* @return
*/
public Object getPre(Object obj);
/**
* 返回这个元素的后继
* @param obj
* @return
*/
public Object getNext(Object obj);
/**
* 第i个位置插入新的元素对象
* @param obj
* @param i
*/
public void insertElementAt(Object obj ,int i);
/**
* 删除第i个元素
* @param i
* @return
*/
public Object remove(int i);
/**
* 删除数据元素obj,并返回这个元素的值
* @param obj
* @return
*/
public Object remove(Object obj);
}
接下来用数组实现线性表。数组的类型是Object类型,所以,数组中每个元素实际元素存储的是对象的。
package com.ezreal; public class SqList implements ListIntf {
final int maxlen = 1000;
Object v[] = new Object[maxlen];
int len = 0; public SqList() { } @Override
public void add(Object obj) {
if(len == maxlen){
System.out.println("溢出");
}else{
v[len] = obj;
len++;
}
} @Override
public int size() {
return len;
} @Override
public void clear() { len =0;
} @Override
public boolean isEmpty() { if(len == 0){
return true;
}
return false;
} @Override
public Object get(int i) {
if(i<1 || i>len){
System.out.println("获取元素位置不正确");
}else{
return v[i-1];
}
return null; } @Override
public int indexOf(Object obj) {
for(int i=0;i<len;i++){
if(v[i].equals(obj)){
return i;
}
}
return -1;
} @Override
public Object getPre(Object obj) {
int i = indexOf(obj);
if(i==-1){
System.out.println("无该元素");
}else if(i == 0){
System.out.println("无前驱");
}else{
return v[i-1];
} return null;
} @Override
public Object getNext(Object obj) {
int i = indexOf(obj);
if(i==-1){
System.out.println("无该元素");
}else if(i == len){
System.out.println("无前驱");
}else{
return v[i+1];
} return null;
} @Override
public void insertElementAt(Object obj, int i) {
if(len == maxlen){
System.out.println("溢出");
return;
}else {
if(i < 0 || i >len){
System.out.println("插入位置不正确");
return;
}else{
for(int j=len-1;j>=i-1;j--){
v[j+1]=v[j];//第i个元素和他后面的所有元素均后移一个位置
}
v[i-1]=obj;
len++;
return;
} } } @Override
public Object remove(int i) {
Object obj;
if(i<1 || i>len){
System.out.println("删除位置不正确");
}else{
obj = v[i-1];
for(int j=i;j<len;j++){
v[j-1]=v[j];
}
len--;
return obj;
}
return null; } @Override
public Object remove(Object obj) {
int i=indexOf(obj);
if(i==-1){
System.out.println("无该元素");
}else {
remove(i+1);
} return null;
} }
如有不对的地方,请各位看官指出。