数据结构——线性表——顺序表

来源:互联网 发布:淘宝销量可以刷吗 编辑:程序博客网 时间:2024/06/01 13:59

1. 线性表

  线性表是最常用且最简单的数据结构。简而言之,一个线性表是n个数据元素的有限序列。至于每一个元素的具体含义,在不同的情况下各不相同,它可以是一个数字或一个符号,也可以是一页书,甚至是更复杂的信息。

2. 线性表的特点

  • 存在唯一一个被称作“第一个”的数据元素;

  • 存在唯一的一个被称作“最后一个”的数据元素;

  • 除第一个元素以外,集合中的每一个元素均只有一个前驱;

  • 除最后一个以外,集合中的每一个元素均只有一个后继。

3. 线性表的源代码

AbstractLineMethod.java

package com.mycompany;import util.ObjectHolder;/** * Created by HP on 2017/9/6. */public interface AbstractLineMethod {    /**     * 初始化线性表     * @param size     */    void initList(int size);    /**     * 销毁线性表     */    void destroyList();    /**     * 清空线性表     */    void clearList();    /**     * 线性表判空     * @return     */    boolean listEmpty();    /**     * 获取线性表的长度     * @return     */    int listLength();    /**     * 获取指定位置处的元素     * @param i     * @param ele     * @return     */    public boolean getElem(int i, ObjectHolder ele);    /**     * 获取该元素在线性表中第一次出现的位置     * @param ele     * @return     */    public int locateElem(ObjectHolder ele);    /**     * 获取指定元素的前驱     * @param currentElem     * @param preElem     * @return     */    public boolean priorElem(ObjectHolder currentElem,ObjectHolder preElem);    /**     * 获取指定元素的后继     * @param currentElem     * @param nextElem     * @return     */    public boolean nextElem(ObjectHolder currentElem,ObjectHolder nextElem);    /**     * 在线性表的指定位置处插入元素     * @param i     * @param ele     * @return     */    public boolean listInsert(int i,Object ele);    /**     * 删除线性表指定位置处的元素     * @param i     * @param ele     * @return     */    public boolean listDelete(int i,ObjectHolder ele);    /**     * 循环遍历线性表     */    public void listTraverse();}

LineMethod.java

package com.mycompany;import util.ObjectHolder;/** * Created by HP on 2017/9/6. */public class LineMethod implements AbstractLineMethod{    private int m_size = 0;    private Object[] m_pList = null;    private int m_iLength = 0;    /**     * 初始化线性表     * @param size     */    public void initList(int size){        this.m_size = size;        this.m_pList = new Object[size];        this.m_iLength = 0;    }    /**     * 销毁线性表     */    public void destroyList(){        this.m_pList = null;        this.m_size = 0;        this.m_iLength = 0;    }    /**     * 将线性表指针归零     */    public void clearList(){        this.m_iLength = 0;    }    /**     * 判空操作     * 如果线性表为空,则返回true否则返回false     * @return     */    public boolean listEmpty(){        if(this.m_iLength == 0){            return true;        }        return false;    }    /**     * 返回线性表的长度     * @return     */    public int listLength(){        return m_iLength;    }    /**     * 获取指定位置处的元素     * @param i     * @param ele     * @return     */    public boolean getElem(int i, ObjectHolder ele){        if(i < 0 || i >= m_size){            return false;        }        ele.object = this.m_pList[i];        return true;    }    /**     * 寻找第一个满足ele的数据元素的位序     * @param ele     * @return     */    public int locateElem(ObjectHolder ele){        for(int i = 0;i < this.m_iLength; i++){            if(this.m_pList[i] == ele.object){                return i;            }        }        return -1;    }    /**     * 获取指定元素的前驱,如果存在,则返回true,不存在则返回false     * @param currentElem     * @param preElem     * @return     */    public boolean priorElem(ObjectHolder currentElem,ObjectHolder preElem){        //如果查找元素不位于线性表,则返回false        int temp = locateElem(currentElem);        if(temp == -1){            return false;        }        //第一个元素没有前驱,所以说应该加以排除        if(temp == 0){            return false;        }        preElem.object = this.m_pList[temp - 1];        return true;    }    /**     * 获取指定元素的后继,如果存在则返回true,如果不存在则返回false     * @param currentElem     * @param nextElem     * @return     */    public boolean nextElem(ObjectHolder currentElem,ObjectHolder nextElem){        //如果所查找元素不是位于线性表中,则返回false        int temp = locateElem(currentElem);        if(temp == -1){            return false;        }        //最后一个元素没有后继,应该加以排除        if(temp == this.m_iLength -1){            return false;        }        nextElem.object = this.m_pList[temp + 1];        return true;    }    /**     * 在指定位置处插入指定元素,如果插入成功则返回true,失败则返回false     * @param i     * @param ele     * @return     */    public boolean listInsert(int i,Object ele){        if(i < 0 || i > this.m_iLength){            return false;        }        for (int k = this.m_iLength - 1;k >= i;k --){            this.m_pList[k + 1] = this.m_pList[k];        }        this.m_pList[i] = ele;        this.m_iLength ++;        return true;    }    /**     * 在线性表中删除指定的元素,如果删除成功,则返回true,如果删除失败则返回false     * @param i     * @param ele     * @return     */    public boolean listDelete(int i,ObjectHolder ele){        if(i < 0 || i >= this.m_iLength){            return false;        }        ele.object = this.m_pList[i];        for(int k = i +1;k < this.m_iLength;k ++){            this.m_pList[k - 1] = this.m_pList[k];        }        this.m_iLength --;        return true;    }    /**     * 循环遍历线性表中的元素     */    public void listTraverse(){        for(int i = 0;i < this.m_iLength;i ++){            System.out.println(this.m_pList[i]);        }    }}

Union.java

package util;/** * Created by HP on 2017/9/6. */public class ObjectHolder {    public Object object;}

  线性表是一个相当灵活的数据结构,它的长度可以根据需要增长或缩短,即对线性表的数据元素不仅可以进行访问,还可以进行插入和删除等操作。

  下面是对于上面线性表所执行的CRUD操作

TestLineMethod.java

package com.mycompany;import org.apache.log4j.Logger;import org.junit.Assert;import org.junit.Test;import util.ObjectHolder;/** * Created by HP on 2017/9/7. */public class TestLineMethod {    private static final Logger log = Logger.getLogger(TestLineMethod.class);    public AbstractLineMethod createList(){        Object e1 = 3;        Object e2 = 5;        Object e3 = 7;        Object e4 = 2;        Object e5 = 9;        Object e6 = 1;        Object e7 = 8;        AbstractLineMethod abstractLineMethod = new LineMethod();        abstractLineMethod.initList(10);        abstractLineMethod.listInsert(0,e1);        abstractLineMethod.listInsert(1,e2);        abstractLineMethod.listInsert(2,e3);        abstractLineMethod.listInsert(3,e4);        abstractLineMethod.listInsert(4,e5);        abstractLineMethod.listInsert(5,e6);        abstractLineMethod.listInsert(6,e7);        return abstractLineMethod;    }    /**     * 测试增加数据     */    @Test    public void testInsert(){        AbstractLineMethod abstractLineMethod = createList();        abstractLineMethod.listTraverse();        //输出结果:3,5,7,2,9,1,8        Assert.assertEquals(7,abstractLineMethod.listLength());    }    /**     * 测试删除数据     */    @Test    public void testDelete(){        ObjectHolder ele = new ObjectHolder();        AbstractLineMethod abstractLineMethod = createList();        abstractLineMethod.listDelete(1,ele);        abstractLineMethod.listTraverse();        //输出结果:3,7,2,9,1,8        Assert.assertEquals(6,abstractLineMethod.listLength());    }    /**     * 测试修改     * 修改操作实际上我们可以看做是两个基本操作的合成操作     * 也就是说修改操作我们可以看成是删除操作+新增操作,所以说我们在这里可以这样做     */    @Test    public void testUpdate(){        ObjectHolder ele = new ObjectHolder();        AbstractLineMethod abstractLineMethod = createList();        //先执行删除操作        abstractLineMethod.listDelete(1,ele);        //再执行插入操作        abstractLineMethod.listInsert(1,9);        abstractLineMethod.listTraverse();        //输出结果:3,9,7,2,9,1,8        Assert.assertEquals(7,abstractLineMethod.listLength());    }    /**     * 查找数据     */    @Test    public void testSearch(){        //被查找元素        ObjectHolder ele = new ObjectHolder();        ele.object = 7;        AbstractLineMethod abstractLineMethod = createList();        abstractLineMethod.listTraverse();        //输出结果3,5,7,2,9,1,8        int i = abstractLineMethod.locateElem(ele);        Assert.assertEquals(2,i);        log.info("该元素第一次出现的位置为:" + i);    }    /**     * 获取前驱     */    @Test    public void testPriorElem(){        ObjectHolder ele = new ObjectHolder();        ObjectHolder current = new ObjectHolder();        current.object = 9;        AbstractLineMethod abstractLineMethod = createList();        abstractLineMethod.listTraverse();        //输出结果3,5,7,2,9,1,8        Assert.assertEquals(true,abstractLineMethod.priorElem(current,ele));        Assert.assertEquals(2,ele.object);        log.info("前驱元素为:" + ele.object);    }    /**     * 获取后继元素     */    @Test    public void testNextElem(){        ObjectHolder ele = new ObjectHolder();        ObjectHolder current = new ObjectHolder();        current.object = 9;        AbstractLineMethod abstractLineMethod = createList();        abstractLineMethod.listTraverse();        //输出结果3,5,7,2,9,1,8        Assert.assertEquals(true,abstractLineMethod.nextElem(current,ele));        Assert.assertEquals(1,ele.object);        log.info("后继元素为:" + ele.object);    }    /**     * 获取指定位置处的元素     */    @Test    public void testGetElem(){        ObjectHolder ele = new ObjectHolder();        AbstractLineMethod abstractLineMethod = createList();        abstractLineMethod.listTraverse();        //输出结果3,5,7,2,9,1,8        Assert.assertEquals(true,abstractLineMethod.getElem(2,ele));        Assert.assertEquals(7,ele.object);        log.info("在索引值为2出的元素值为:" + ele.object);    }}

4. 项目源码

  文章中所引用的代码已经作为开源项目“linear-table”被我存放到了CSDN.NET上供大家下载,但是我这里并不贴出该项目在CSDN.NET中的源码,因为CSDN已经决定将CSDN.NET迁移到码云上,所以说我这里就直接上存放到码云上的开源项目“linear-table”。

CSDN.NET迁移到码云上的公告

  • CODE 项目整体迁移到码云平台的公告

linear-table开源项目下载地址

  • linear-table