一、线性结构定义
如果一个数据元素序列满足:
(1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素;
(2)第一个数据元素没有前驱数据元素;
(3)最后一个数据元素没有后继数据元素。
则称这样的数据结构为线性结构。
二、线性表抽象数据类型
线性表抽象数据类型主要包括两个方面:即数据集合和该数据集合上的操作集合。
数据集合可以表示为a0,a1,a2,...an-1,每个数据元素的数据类型可以是任意的类型。
操作集合包括如下:
1.求元素个数
2.插入
3.删除
4.查找
5.判断是否为空
三、顺序表
计算机有两种基本的存储结构:顺序结构、离散结构。使用顺序结构实现的线性表称为顺序表。
四、顺序表效率分析
顺序表插入和删除一个元素的时间复杂度为O(n)。
顺序表支持随机访问,顺序表读取一个元素的时间复杂度为O(1)。
顺序表的优点是:支持随机访问,空间利用率高。
顺序表的缺点是:大小固定,插入和删除元素需要移动大量的数据
五、顺序表实现
//设计线性表抽象数据类型的Java接口。 public interface List { //插入元素 public void add(int index,Object obj) throws Exception; //删除元素 public void delete(int index) throws Exception; //获取某个元素 public Object get(int index) throws Exception; //判断是否为空 public boolean isEmpty(); //获得集合的长度 public int size(); }
//顺序表实现 public class SequenceList implements List { //默认长度 public final int defalutSize=20; //最大长度 int maxSize; //当前长度 int size; //存储变量的数组 Object objectArray[]; public SequenceList() { init(defalutSize); } public SequenceList(int size) { init(size); } private void init(int size) { this.maxSize=size; this.size=0; objectArray=new Object[size]; } //插入元素 @Override public void add(int index, Object obj) throws Exception { if(index==maxSize) { throw new Exception("数组已满,不能插入!"); } if(index<0||index>size) { throw new Exception("增加元素时参数错误!"); } //移动元素 for(int i=size;i>index;i--) { objectArray[i]=objectArray[i-1]; } objectArray[index]=obj; size++; } //删除元素 @Override public void delete(int index) throws Exception { //判断是否为空 if(isEmpty()) { throw new Exception("数组为空,不能删除!"); } if(index<0||index>size-1) { throw new Exception("删除元素时参数错误!"); } for(int i=index;i<size;i++) { objectArray[i]=objectArray[i+1]; } size--; } //得到一个元素 @Override public Object get(int index) throws Exception { if(index<0||index>size-1) { throw new Exception("得到元素参数错误!"); } return objectArray[index]; } @Override public boolean isEmpty() { return size==0; } @Override public int size() { return size; } }//自定义学生实体类 public class Students { //学生的id private int id; //学生的姓名 private String name; //学生的性别 private char sex; //学生的联系方式 private String phone; //学生的地址 private String address; //无参的构造方法 public Students() {}; //五个参数的构造方法 public Students(int id,String name,char sex,String phone,String address) { this.id=id; this.name=name; this.sex=sex; this.phone=phone; this.address=address; } //打印学生信息 void printStudentsInfo() { System.out.println(id); System.out.println(name); System.out.println(sex); System.out.println(phone); System.out.println(address); } public static void main(String[] args) { Students stu=new Students(1,"张三",'男',"18267572266","陕西省西安市....."); stu.printStudentsInfo(); } public String toString() { return this.id+" "+this.name+" "+this.sex+this.phone+" "+this.address; } }//测试 public class SquenceListDemo { public static void main(String[] args) { SequenceList list=new SequenceList(10); try { list.add(list.size, new Students(1,"张三",'男',"18292577820","陕西省西安市")); list.add(list.size, new Students(2,"李四",'男',"18292577820","甘肃省兰州")); list.add(list.size, new Students(3,"王五",'男',"18292577820","山西省太原市")); System.out.println(list.size()); for(int i=0;i<list.size();i++) { System.out.println(list.get(i)); } } catch (Exception e) { e.printStackTrace(); } } }
运行结果: