一、线性表的顺序表示
1、定义:线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。(可以理解为数组)
2、元素地址相关计算:假设线性表的每个元素需占用l个存储单元,数据元素所占的第一个单元的存储地址作为存储位置。
①线性表中第i+1个数据元素的存储位置LOC(ai+1)和第i个数据元素的存储位置LOC(ai)之间的关系:LOC(ai+1) = LOC(ai) + l 。(ps:可以理解为递推关系)
②线性表的第i个元素ai的存储位置为:LOC(ai) = LOC(a1) + ( i - 1 ) * l。
二、顺序表在数据存储、基本操作上的特点
优点:①元素存储关系与逻辑关系一致:物理相邻对应逻辑相邻;
②随机存储元素,可以按下标直接访问;
缺点:①插入、删除操作需要移动大量元素;
②空间利用率不高,预先分配空间需按最大空间分配;
三、顺序表的编程模型
1. 定义元素类型与顺序表类型
2. 声明顺序表变量与初始化存储空间 // length = 0
3. 操纵表元素:插入、删除、查找、读取、写入
4. 释放存储空间 //JAVA可以自动回收
1、顺序表初始空间分配
public static final int MAX_LENGTH = 100; //顺序表初始空间分配
public static final int LISTINCREMENT =10; //顺序表空间分配增量
2、顺序表的初始化
public class SequentialList {
public static final int MAX_LENGTH = 100;
int length;
int[] data;
}
3、构造一个空的顺序表
public SequentialList() {
length = 0;
data = new int[MAX_LENGTH];
}
4、初始化一个顺序表
public SequentialList(int[] array) {
data = new int[MAX_LENGTH];
length = array.length;
for (int i = 0; i < array.length; i++) {
data[i] = array[i];
} // Of for i
}
5、重写toString方法,判断顺序表是否为空,不为空则返回顺序表中的元素(遍历数组)
public String toString() {
String resultString = "";
if (length == 0) {
return "The list is empty!";
} // Of if
else if (length != 0) {
for (int i = 0; i < length - 1; i++) {
resultString +=data[i] + ", ";
} // Of for i
}
resultString += data[length - 1];
return resultString;
}
6、清空顺序表
public void reset() {
length = 0;
}// Of reset
综合示范:初始化顺序表,输出顺序表中的元素,再删除元素。
package linear_list;
/**
* The SeguentialList.
*
* @author 前夜
*
*/
public class SequentialList{
public static final int MAX_LENGTH = 10;
int length;
int[] data;
public SequentialList() {
length = 0;
data = new int[MAX_LENGTH];
}// Of SequentialList
public SequentialList(int[] array) {
data = new int[MAX_LENGTH];
length = array.length;
for (int i = 0; i < array.length; i++) {
data[i] = array[i];
} // Of for i
}// Of SequentialList
/**
* Judge whether the list is empty.
*
* Print the elements in the list.
*/
public String toString() {
String resultString = "";
if (length == 0) {
return "The list is empty!";
}// Of if
else if (length != 0) {
for (int i = 0; i < length - 1; i++) {
resultString += data[i] + ", ";
} // Of for i
}// Of if
resultString += data[length - 1];
return resultString;
}// Of toString
/**
* Create an empty list.
*/
public void reset() {
length = 0;
}// Of reset
/**
* The entrance of the program.
*
* @param args Not used now.
*/
public static void main(String args[]) {
int[] tempArray = { 2, 4, 6, 8 };
SequentialList firstList = new SequentialList(tempArray);
System.out.println("Intitailized, the list is: " + firstList.toString());
System.out.println("Again, the list is: " + firstList);
firstList.reset();
System.out.println("After reset, the list is: " + firstList);
}// Of main
}// Of class SequentialList
相关注意事项:
①长度不仅是顺序表的成员变量,也是数组的成员变量。事实上,名称可以是不同类的成员变量。
②长度不要超过分配的空间。