1.线性表的概念:
线性表(linear list)是n个数据元素的有限序列,其元素可以是一个数,一个符号,也可以是由多个数据组成的符合形式,甚至可以是一页书甚至更复杂的信息。
例如:由26个大写的英文字母组成的字母表(A,B,C,....,X,Y,Z)
就是一个线性表,表中的每一个数据都是一个大写字母。
线性表的数据元素可以是多个形式的,但对于同一个线性表,数据元素必须具有相同特性,也就是说,同一线性表里的数据元素必须属于同一种数据类型,表彰响铃的数据元素之间存在一种序偶关系。
线性表中数据元素的个数被定义为线性表的长度。
i=1表示第一个元素,i=n表示第n个元素。
2.线性表的基本操作:
(1)初始化
(2)插入
(3)删除
(4)查找
(5)获取
(6)更新
(7)判空
(8)求长度
(9)正序遍历
(10)销毁
3.线性表的顺序表示和实现
3.1线性表的顺序表示:
线性表的顺序表示指的是用一组地址连续的存储单元一次存储线性表的数据元素。
3.2实现
public class sequencelist<T>{
final int maxSize=10; //顺序表中一维数组的初始长度
private T[] ListArray; //存储顺序表中内容的数组
private int length; //顺序表的长度
public sequencelist() { //初始化线性表
length = 0;
ListArray = (T[]) new Object[maxSize];
}
public sequencelist(int n) {
if(n <= 0) {
System.out.println("error!");
System.exit(1);
}
length = 0;
ListArray = (T[]) new Object[n];
}
public boolean add(T obj, int pos) { //在线性表中添加一个新的元素 增
if( (pos < 1) || (pos > length+1)) {
System.out.println("pos值不合理");
return false;
}
if(length == ListArray.length) {
T[] p = (T[]) new Object[length*2];
for(int i=0; i < length; i ++)
p[i] = ListArray[i];
ListArray = p;
}
for(int j = length; j >= pos; j--)
ListArray[j] = ListArray[j-1];
ListArray[pos-1] = obj;
length++;
return true;
}
public T remove(int pos) { //在线性表中删除一个元素 删
if(pos < 1 || pos > length) {
System.out.println("pos的值出错");
return null;
}
else {
if(length == 0) {
System.out.println("顺序表为空,无法删除");
return null;
}
T o = ListArray[pos-1];
for(int i = pos-1; i < length-1; i++) {
ListArray[i] = ListArray[i+1];
}
length--;
return o;
}
}
public int find(T obj) { //在线性表中查找一个元素的位置 查
if(isEmpty()) {
System.out.println("顺序表为空,无法查询元素。");
return -1;
}
else {
for(int i = 0; i < length; i ++) {
if(ListArray[i].equals(obj))
return i+1;
}
return -1;
}
}
public T value(int pos) { //在线性表中知道某个位置的值 查
if(isEmpty()) {
System.out.println("顺序表为空,该位置无值");
return null;
}
else {
if(pos < 1 || pos > length)
return null;
else
return ListArray[pos-1];
}
}
public boolean modify(T obj, int pos) { //更新线性表 改
if(isEmpty()) {
System.out.println("线性表为空,无法更新值。");
return false;
}
else {
if(pos < 1 || pos > length) {
System.out.println("更新位置非法,无法更新.");
return false;
}
else {
ListArray[pos-1] = obj;
return true;
}
}
}
public boolean isEmpty() { //判断是否为空
return length==0;
}
public int size() { //求线性表中数据的个数
return length;
}
public void nextOrder() { //依次访问每个元素并输出
System.out.print("线性表中的数据有:");
for(int i = 0; i < length; i++)
System.out.print(ListArray[i]+" ");
System.out.println();
}
public void clear() { //清空线性表
length=0;
}
}
上述为实现的代码,常用的包括增删改查的方法
下面为我的测试类:
public class TestSequencelist {
public static void main(String[] args) {
// TODO Auto-generated method stub
sequencelist<Integer> L = new sequencelist<Integer>();
int status, e, i;
int[] a = new int[] {11, 12, 13, 14, 15};
for(int j=0; j < a.length; j++)
L.add(a[j], j+1);
L.nextOrder();
L.add(16, 1);
L.nextOrder();
int m = L.value(5);
System.out.println("位置5上的值为:" + m);
int r = L.find(new Integer("16"));
System.out.println("16在顺序表中的位置为:" + r);
L.remove(3);
L.nextOrder();
}
}
最终的结果为
在编写顺序表实现时,需要注意增加删除时的移动,以及是否合法的判定