第二章 数据结构中线性表的学习

线性表是一种最常用、最简单,也是最基本的数据结构,它是学习其他数据结构的基础。

有顺序存储和链式存储两种存储结构来表示。

顺序储存结构表示的线性表称为顺序表,用链式存储结构表示的线性表成为链表。

链表又有单链表、双向链表、循环链表。。

线性表是 n 个数据元素所构成的有限序列,通常表示为(a0,a1,...,a i,a n-1 )。

其中下标为i的标识元素在线性表中的位序号,n 为表长,当 n=0 时,此线性表为空表。

线性表中的数据元素a仅仅时一个抽象符号。不同场合下可以是 字母,数字,记录或者其它更复杂的信息。

对于同一个线性表,其么一个数据元素的值虽然不同,但必须具有相同的数据类型。

而且,数据元素之间具有一种线性的或者“一对一”的逻辑关系。

<1> 第一个数据元素没有前驱,这个数据元素也称为开始点。

<2> 最后一个数据元素没有后继,这个数据元素也称为终端结点。

<3>除第一个和最后一个数据元素之外,其它元素有且仅有一个前驱和一个后继,

具有上述逻辑关系的数据结构也称为线性结构,线性表也是一种线性结构。

2.线性表的抽象数据类型

线性表的长度可以动态的增长或设缩短,可以对于线性表中任何数据元素进行放稳和查找,

数据元素的删除和插入操作也可以在线性表中的任何位置进行,求线性表中

指定数据元素的前驱和后继,可以将两个线性表合并成一个线性表,或者将一个

线性表可以拆分成两个或者多个线性子表。

/**
 * 线性表抽象数据类型Java接口描述如下:
 */
public interface Ilist {
    public void clear();
    public boolean isEmpty();
    public int length();
    public Object get(int i);
    public void insert(int i,Object x);

    /**
     * 在线性表的第i个元素前面插入x元素
     * 若i=0,在表头插入,i=length()在表尾插入x。
     */
    public void remove(int i);
    public int indexOf(Object x);
    public void display(); //输出线性表中各个数据元素的值
    
}
/**
 *  要使用线性表的Java接口,还需要具体的类来实现该接口。
 *  Java接口的两种实现方法:1.基于顺序存储
 *                        2.基于链式存储实现的
 */

2.顺序表的特点

<1> 在线性表中逻辑上相邻的书元素,在物理存储结构上也是相邻的。

<2> 存储密度高,但应预先分配“足够应用”的存储空间,

这可能将会造成存储空间的浪费。

<3> 便随机存取。

<4> 不便于删除和插入操作。

package ch01;
import 数据结构.Ilist;

/**
 * @author ${Jason}
 * @date 2019/3/20
 * @time 21:02
 */

/**
 * 类包含成员变量和成员函数。
 * 成员变量用来表示抽象类数据类型中定义的数据对象,
 * 成员函数用来表示抽象数据类型定义的操作集合。
 * 顺序表类实现接口Ilist,类中的public成员函数主要是接口Ilist中定义的成员函数。
 */
 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() {
       curLen = 0;

    }

    @Override
    public boolean isEmpty() {
        return curLen == 0;
    }

    @Override
    public int length() {
        return curLen;
    }

    @Override
    public Object get(int i) throws Exception {

     if( i < 0 || i > curLen - 1)
         throw new Exception("第" + i +"个元素不存在 ");
        return listElem;
    }

    @Override
    public void insert(int i, Object x) throws Exception {
        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;
            curLen++;

    }

    @Override
    public void remove(int i) throws Exception {
        if(i < 0 || i > curLen - 1)
            throw new Exception("删除位置不合法");
        for( int j = i; j < curLen - 1; j++)
            listElem[j] = listElem[j + 1];

        curLen--;

    }

    @Override
    public int indexOf(Object x) {
        int j = 0;
        while (j < curLen && !listElem[j].equals(x))
            j++;
        if(j < curLen)
            return  j;
        else
        return -1;
    }

    @Override
    public void display() {
    for(int j = 0; j < curLen; j++)
        System.out.print(listElem[j] + " ");
        System.out.println();
    }
}

猜你喜欢

转载自blog.csdn.net/Jason_LH1024/article/details/88700683