前言
数据结构自学第一天
一、线性表概述
1.概念
线性表是由n个数据元素所构成的有限序列,当n=0时线性表为空表
2.特点
1)第一个元素没有前驱,这个数据元素也称为开始结点
2)最后一个元素没有后继,尾结点
3)除第一个元素和最后一个元素外,其他数据元素有且仅有一个前驱和一个后继。
3.抽象类型描述
public interface IList{
public void clear();//将一个已经存在的线性表置空
public boolean isEmpty();//判断线性表是否为空,若为空,返回true,反之返回flase
pubilc int length();//返回线性表的长度
public object get(int i);//读取并返回线性表中第i个数据元素的值。其中i的取值范围为0<=i<=length()-1
public void insert(int i,Object x);//在线性表第i个位置插入x这个值
public void remove(int i);//删除第i个位置的数据
public int indexOf(Object x);//返回线性表中首次出现指定数据元素的位序号,若线性表中不包含此数据元素,返回-1;
public void display();//输出线性表的各个数据元素的值
}
二、线性表的顺序存储
1.定义
顺序存储是用一组地址连续的存储单元依次存放线性表中各个元素的存储结构
2.特点
1)地址计算公式
所求地址=初始地址+i*c(第i个元素的地址)
2)在顺序表中逻辑相邻的数据元素,物理地址也是相邻的
3)便于随机存取,但是不便于插入和删除
4)存储密度高,需要预先分配足够的存储空间
3.Java接口实现类
public class SqList implements ILst{
private Object[] listElem;//线性表的存储空间
private int curLen;//线性表当前的长度
//循序表类的构造函数,构造一个存储容量为maxSize的线性表
public SqList(int maxSize)
{
curLen=0;
ListElem=new Object[maxSize];
}
//清空线性表
pubilc void clear()
{curLen=0;
}
//判断线性表中的数据元素的个数是否为0,为0返回true,否则返回false
public boolean isEmpty()
{
return curLen==0;
}
//返回线性表中数据元素的个数并返回其值
public int length()
{
return curLen;
}
4.顺序表的插入操作
根据顺序表的特点,逻辑上相邻的数据元素在物理上也是相邻的,因此如果想要进行插入,那么插入结点后面的数据都要依次后移,且表长加一
/*思路:
1.判断当前线性表的存储空间是否已满,若满抛出异常
2.判断参数i的合法性,若i不合法则抛出异常
3.确定插入的位置
4.将插入位置及其后的所有数据元素后移一个存储位置
*/
public void insert(int i,object x) throws Exception
{
if(curLen==listElem.length)
throws new Exception("顺序表已满");
if(i<0||i>curLen)
throws new Exception("插入位置不合法");
for(int j=curLen;j>i;j--)
{
ListElemist[j-1];
}
ListElem[i]=x;
curLen++;
5.顺序表的删除操作
删除某一个数据元素的时候,此元素后面所有的元素位置都要向前一位
/*
1.判断i的合法性,如何不合法就抛出异常
2.从i开始后面所有的元素的位置都向前移一位
*/
public void remove(int i) throws Exception
{
if(i<0||i>curLen)
{
throws new Exception("位置异常");
}
for(int j=i;j<curLen-1;j++)
{
ListElem[j]=ListElem[j+1];
}
curLen--;
5.顺序表的查找操作
顺序表查找有两种方法,第一种是查找指定位置上的数据元素的值,第二种是查找满足指定条件的数据元素初次出现的位置。第一种方法通过随机存取的方式就可以实现,即根据下标进行寻找,第二种相对来说有点点复杂
public int intdexOf(Object x)
{
int i=0;
while(i<curLen&&!ListElem.equals(x))
{
i++;
}
if(j<curLen)
return j;
else return -1;
}