线性表
线性表的逻辑结构
线性表是最简单且最常用的一种数据结构,它具备线性结构的特点,并且表中元素属于同一数据对象,元素之间存在一种序偶关系。
线性表可逻辑地表示为(a1,a2,…,ai-1,ai,ai+1,…,an)其中a1为表中的第一个数据元素,an为最后一个数据元素,ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。当i=1,2,…,n-1时,ai有且仅有一个直接后继,当i=2,3,…,n时,ai有且仅有一个直接前驱。
线性表是一种比较灵活的数据结构,可以根据不同的需要对线性表进行多种操作,常见的基本操作有:
(1)初始化——构造一个空的线性表
(2)插入——在线性表的第i个位置之前插入一个新元素
(3)删除——删除线性表中的第i个数据元素
(4)查找——找出线性表中满足特定条件的元素的位置
(5)获取——取线性表中的第i个数据元素
(6)更新——取线性表中的第i个数据元素,检查或更新其中某个数据项的内容
(7)判空——判断当前线性表是否为空
(8)求长度——求出线性表中数据元素的个数
(9)正序遍历——依次访问线性表中每个元素并输出
(10)销毁——销毁一个已存在的线性表
将上述基本操作进行组合,可以实现对线性表的各种更复杂的操作。
顺序表
- 知识点1:
在顺序存储结构的线性表中插入或删除一个数据元素,平均约移动表中一半元素,算法add和remove的时间复杂度均为O(n)。
代码实现
package 顺序表;
public class sequenceList<T>{
final int maxSize = 10; // 顺序表中一维数组的初始长度
private T[] listArray ; // 保存元素的数组对象
private int length; // 保存顺序表的当前长度
/**
* 构造方法: 初始化
*/
public sequenceList(){
length = 0; // 将顺序表当前长度设置为0
listArray = (T[])new Object[maxSize]; // 设置listArray长度为maxSize
}
public sequenceList(int n){
if (n<0){
System.out.println("error");
System.exit(1);
}
length = 0;
listArray = (T[]) new Object[n]; // 设置listArray长度为n
}
/**
* 添加一个元素
* @param obj 添加的元素
* @param pos 添加的位置
* @return
*/
public boolean add(T obj, int pos){
if(pos < 0 || pos >listArray.length){
System.out.println("pos 不合法");
return false;
}
if(length == listArray.length){ // 顺序表满了,2倍扩容
T[] p = (T[]) new Object[2*length];
for (int i = 0; i < length ; i++)
p[i] = listArray[i];
listArray = p;
}
for (int i = length; i >= pos; i--)
listArray[i] = listArray[i-1]; // 插入位置后边的数,整体后移
listArray[pos-1] = obj;
length ++;
return false;
}
/**
* 删除线性表中的某个元素
* @param pos 删除的位置
* @return
*/
public T remove(int pos){
if( isEmpty()){
System.out.println("链表为空,无法删除。");
return null;
}else{
if(pos < 1 || pos > length){
System.out.println("pos 值不合法");
return null;
}
T x = listArray[pos-1]; // 取出要删除的元素
for (int i = pos; i <= length ; i++)
listArray[i-1] = listArray[i]; // 将删除位置后面的元素,前移
length --; // 长度减1
return x;
}
}
/**
* 查找是否存在某个元素
* @param obj 查找的元素
* @return
*/
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;
}
}
/**
* 从线性表中获取一个元素,并返回
* @param pos
* @return
*/
public T value(int pos){
if(isEmpty()){
System.out.println("顺序表为空。");
return null;
}else{
if(pos < 1 || pos > length){
System.out.println("pos 值不合法");
return null;
}
return listArray[pos-1];
}
}
/**
* 更新线性表中某个元素
* @param obj 更新的值
* @param pos 更新的位置
* @return
*/
public boolean modify(T obj, int pos){
if(isEmpty()){
System.out.println("顺序表为空。");
return false;
}else{
if(pos < 1 || pos > length){
System.out.println("pos 值非法。");
return false;
}
listArray[pos-1] = obj;
return true;
}
}
/**
* 判断线性表是否为空
* @return
*/
public boolean isEmpty(){
return length == 0;
}
/**
* 求线性中元素的个数
* @return
*/
public int size(){
return length;
}
/**
* 按序访问线性表中的元素,并输出
*/
public void listByOrder(){
for (int i = 0; i < length ; i++)
System.out.println(listArray[i]);
}
/**
* 清空线性表中的元素
*/
public void clear(){
length = 0;
}
}
package 顺序表;
public class Test {
public static void main(String[] args) {
sequenceList<Integer> seqList = new sequenceList<Integer>();
seqList.add(11,1);
seqList.add(23,2);
seqList.add(35,3);
seqList.add(22,4);
seqList.add(34,5);
seqList.listByOrder();
System.out.println("元素23的位置: "+ seqList.find(23));
System.out.println("顺序表第3个位置的元素: "+ seqList.value(3));
System.out.println("移除元素35: " + seqList.remove(34));
}
}
- 运行结果
链表