线性表是一种最常见、最简单,也是一种最基本的数据结构,它是学习其他数据结构的基础。线性表有两种存储结构:顺序表和链表。下面我主要介绍顺序表。
所谓顺序表,就是顺序存储的线性表。顺序存储是用一组地址连续的存储单元一次存放线性表中各个数据元素的存储结构。顺序表基本使用数组来实现。
顺序表的特点:
- 在线性表中逻辑上相邻的数据元素,在物理存储位置上也是相邻的
- 存储密度高,但需要预先分配“足够应用”的存储单位,可能会造成存储空间的浪费
- 便于随机存放
- 不利于插入和删除操作,因为在顺序表上进行插入和删除操作会引起大量数据元素的移动
下面是线性表接口的描述:
package sequenceTable;
public interface IList {
public void clear();
public boolean isEmpty();
public int length();
public Object get(int i) throws Exception;
public void insert(int i,Object x) throws Exception;
public void remove(int i) throws Exception;
public int indexOf(Object x);
public void diaplay();
}
下面是顺序表类的描述:
package sequenceTable;
public class SqList implements IList {
private Object[] listElem;
private int curLen;
public SqList(int maxSize) {
curLen=0;
listElem=new Object[maxSize];
}
@Override
//将一个已经存在的线性表置成空表
public void clear() {
// TODO Auto-generated method stub
curLen=0;
}
@Override
//判断线性表是否为空
public boolean isEmpty() {
// TODO Auto-generated method stub
return curLen==0;
}
@Override
//判断线性表的长度
public int length() {
// TODO Auto-generated method stub
return curLen;
}
@Override
//读取线性表的第i个元素并返回其值
public Object get(int i) throws Exception {
// TODO Auto-generated method stub
if(i<0 || i>curLen-1) //i小于0或者大于表长减1
throw new Exception("第"+i+"个元素不存在");
return listElem[i-1];
}
@Override
//在线性表的第i个元素之前插入一个值为x的数据元素
public void insert(int i, Object x) throws Exception{
// TODO Auto-generated method stub
if(curLen==listElem.length)
throw new Exception("顺序表已满");
if(i<0 || i>curLen)
throw new Exception("插入位置不合法");
for(int j=curLen;j>i;j--)
listElem[j]=listElem[j-1]; //插入位置及其之后的所有数据元素后移一位
listElem[i]=x; //插入x
curLen++; //表长+1
}
@Override
//删除并返回线性表的第i个数据元素
public void remove(int i) throws Exception{
// TODO Auto-generated method stub
if(i<0 || i>curLen-1)
throw new Exception("删除位置不合法");
for(int j=i;j>curLen-1;j++)
listElem[j]=listElem[j+1]; //删除位置之后的所有数据元素左移一位
curLen--; //表长减1
}
@Override
//返回线性表中首次出现指定元素的位序号
public int indexOf(Object x) {
// TODO Auto-generated method stub
int j=0;
while(j<curLen && !listElem[j].equals(x))
j++;
if(j<curLen)
return j;
else
return -1;
}
@Override
//输出线性表中的元素
public void diaplay() {
// TODO Auto-generated method stub
for(int j=0;j<curLen;j++) {
System.out.println(listElem[j]+" ");
}
System.out.println(); //换行
}
}
测试类:
package sequenceTable;
import java.util.Scanner;
public class SqListTest {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//建立一个顺序表('a','b','c','d','a','e','f'),查找顺序表中第一次出现字母a的位置,并查找第i个元素的直接前驱
SqList L=new SqList(15); //创建存储单位为10的空顺序表
L.insert(0,'a'); //初始化前6个数据元素
L.insert(1,'b');
L.insert(2,'c');
L.insert(3,'d');
L.insert(4,'a');
L.insert(5,'e');
L.insert(6,'f');
int order=L.indexOf('a'); //在顺序表中查找值为a的数据元素
if(order!=-1)
System.out.println("顺序表中第一次出现元素a的位置是:"+order);
else
System.out.println("此顺序表中不包含值为a的数据元素");
System.out.println("请输入想要查找第几个元素的直接前驱:");
int i=new Scanner(System.in).nextInt();
if(i>0 && i<=L.length())
System.out.println("第"+i+"个元素的前驱元素是:"+L.get(i-1));
else
System.out.println("第"+i+"个元素的前驱元素不存在");
}
}

线性表作为基础数据结构,分为顺序表和链表。本文重点探讨顺序表,它采用连续存储,逻辑相邻的元素物理位置也相邻。顺序表存储密度高,但预分配可能导致空间浪费,且插入删除操作效率较低,需要移动大量元素。文章通过接口和类描述,阐述顺序表的概念和操作。
1558

被折叠的 条评论
为什么被折叠?



