数据结构-顺序表

描述:
n个类型相同的元素有顺序的队列,对于n>0,除第一个元素无直接前驱,最后一个元素无直接后继,其余元素都有一个直接前驱和一个直接后继

线性表的特点:
同一性:表中所有元素都属于同一种数据类型
有穷性:元素个数有限
有序性:相邻元素间存在序偶关系

抽象定义:
ADT {
    数据元素: D = {a1,a2,...an | ai 属于集合D0, n>=0 , DO为某一数据类型}
    结构关系: R = {<ai, ai+1> | ai,ai+1属于集合D0 , i = 1,2,...,n-1}
    基本操作:
    1.InitList(L)
        操作前提:L为未初始化的线性表
        操作结果:将L初始化为空表
    2.ListLength(L)
        操作前提:线性表L已存在
        操作结果:如果L为空表则返回0,否则返回表中的元素个数
    3.GetData(L,i)
        操作前提:表L存在,且1<=i<=ListLength(L)
        操作结果:返回表L中的第i个元素
    4.InsList(L,i,e)
        操作前提:表L存在,且1<=i<=ListLength(L)+1,且e为合法元素
        操作结果:在L中第i个位置之前插入新的数据元素e,L的长度增加1
    5.DelList(L,i,e)
        操作前提:表L存在且非空,且1<=i<=ListLength(L)
        操作结果:删除L表的第i个数据元素,并用e返回其值,L的长度减1
    6.Locate(L,e)
        操作前提:表L已经存在,e为合法数据元素值
        操作结果:如果L中存在数据e,则将当前指针指向该元素数据e所在的位置,并返回TRUE,否则返回FALSE
    7.DestroyList(L)
        操作前提:线性表L已经存在
        操作结果:将L销毁
    8.ClearList(L)
        操作前提:线性表L已经存在
        操作结果:将L置空
    9.EmptyList(L)
        操作前提:线性表L已经存在
        操作结果:如果L为空表则返回TRUE,否则返回FALSE
}

顺序存储结构:
1.关系线性化
2.节点顺序存

线性表的基本操作
1.查找:
    a.按序号查找
    b.按照内容查找
2.插入

实现

package com.dataStructure.chapter2;

/**
 * 自定义顺序队列
 */
public class ArrayList {
    /**
     * 初始队列尺寸
     */
    final static int MAXSIZE = 100;

    /**
     * 线性表定义 利用java Oject是祖宗的语法特性
     */
    private Object[] elem;

    /**
     * 记录线性表最后的一个元素所在位置 没有元素时-1
     */
    private int last = -1;

    public ArrayList() {
        initList();
    }

    /**
     * 初始化
     */
    public void initList() {
        this.elem = new Object[MAXSIZE];
    }

    /**
     * 按序号查找元素
     * 
     * @param i 位置
     * @return 元素
     * @throws Exception
     */
    public Object getData(int i) throws Exception {
        if (emptyList(this)) {
            throw new Exception("list is empty");
        }
        if (i > elem.length || i < 0) {
            throw new IndexOutOfBoundsException();
        }
        return elem[i];
    }

    /**
     * 顺序遍历
     * 
     * @param e 查找的元素
     * @return 元素下标
     * @throws Exception
     */
    public int locate(Object e) throws Exception {
        if (emptyList(this)) {
            throw new Exception("list is empty");
        }
        for (int i = 0; i < elem.length; i++) {
            if (e.equals(elem[i])) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 线性表添加数据在i号位置
     * 
     * @param i 下标
     * @param e 被插入的元素
     * @return
     */
    public boolean insList(int i, Object e) {
        if (last == elem.length - 1) {
            System.out.println("list full");
            return false;
        }
        if (i < 0 || (i > last && last != -1)) {
            System.out.println("invalid insert location");
            return false;
        }
        /*
         * 移位
         */
        for (int j = last; j >= i; j--) {
            elem[j + 1] = elem[j];
        }

        elem[i] = e;
        last++;
        return true;
    }

    /**
     * 删除元素
     * 
     * @param i 下标
     * @return 被移除的元素
     */
    public Object delList(int i) {
        if (i < 0 || i > last) {
            System.out.println("invalid insert location");
            return null;
        }

        Object delElem = elem[i];

        for (; i < last - 1; i++) {
            elem[i] = elem[i++];
        }
        last--;

        return delElem;
    }

    /**
     * 校验线性表是否为空
     * 
     * @param list 线性表
     * @return 是否为i空
     */
    public boolean emptyList(ArrayList list) {
        return last == -1;
    }
}

测试类

package com.dataStructure.chapter2;

import static org.junit.Assert.*;

import org.junit.Test;

public class ArrayListTest {    

    @Test
    public void testGetData() throws Exception {
        ArrayList list = new ArrayList();
        list.insList(0, "1");
        String test = (String) list.getData(0);
        assertEquals("1", test);
    }

    @Test
    public void testLocate() throws Exception {
        ArrayList list = new ArrayList();
        list.insList(0, "1");
        assertEquals(0, list.locate("1"));
    }

    @Test
    public void testDelList() {
        ArrayList list = new ArrayList();
        list.insList(0, "1");
        list.delList(0);
        assertEquals(true, list.emptyList(list));
    }    
}

 

posted @ 2021-04-30 15:28  SMKD_XI  阅读(265)  评论(0)    收藏  举报