数据结构-----顺序表的实现

数据结构:

  数据按逻辑结构分类有:

    线性结构(队列,栈,串):有且仅有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继

    非线性结构:一个结点可能有多个直接前趋和直接后继,如树,图,广义表

  数据的四种基本存储方法:

    (1)顺序存储方法:该方法把逻辑上相邻的结点存储在物理位置上相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。(多用数组表示)

    (2)链接存储方法:该方法不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系由附加的指针字段表示。

    (3)索引存储方法:该方法通常在储存结点信息的同时,还建立附加的索引表。分稠密索引和稀疏索引

    (4)散列存储方法:该方法的基本思想是:根据结点的关键字直接计算出该结点的存储地址。


   线性结构之顺序结构

    插入和删除操作:平均要移动一半元素,时间复杂度为O(n),其中插入移动位置为n/2;而删除移动次数为(n-1)/2

      ①有且仅有一个开始结点a1,没有直接前趋,有且仅有一个直接后继a2;  
      ②有且仅有一个终结结点an,没有直接后继,有且仅有一个直接前趋an-1
      ③其余的内部结点ai(2≤i≤n-1)都有且仅有一个直接前趋ai-1和一个ai+1

     顺序表的基本功能有:1,InitList(L)2,ListLength(L)3,GetNode(L,i) 4,LocateNode(L,x);

               5,InsertList(L,x,i);6,DeleteList(L,i)(其实在Java中ArrayList已经实现,下面是我实现的简单的例子O(∩_∩)O)

 Java(java8)代码实现如下:

package dataStructByJava;
/*
 * @author zjL
 * @顺序表实现
 * 实现功能:1,InitList(L)2,ListLength(L)3,GetNode(L,i)
 * 4,LocateNode(L,x);5,InsertList(L,x,i);6,DeleteList(L,i)
 */
import java.util.Arrays;
public class SeqList<T> {
    //声明默认容量
    private final int Default_Size=32;
    //声明全局顺序表
    private Object[] MySeq;
    //声明顺序表中元素的个数
    private int size;
    //声明容量大小,用于动态扩展容量,即顺序表的初始长度
    private int capacity;
    //InitList(L)
    public SeqList(){
        capacity=Default_Size;
        MySeq=new Object[capacity];
    }
    //指定长度初始化
    public SeqList(int initSize){
        capacity=1;while(capacity<initSize)
            capacity<<=1;
        MySeq=new Object[capacity];
    }
    //初始化顺序表
    public void setValue(T element,int index){
        if(index<0||index>size-1)
            throw new IndexOutOfBoundsException("IndexOutOfYourSeqList");
        MySeq[index]=element;
    }
    //ListLength(L);
    public int length(){
        return size;
    }
    //GetNode(L,i)
    public T getNod(int index){
        if(index<0||index>size-1)
            throw new IndexOutOfBoundsException("IndexOutOfYourSeqList");
        return (T)MySeq[index];
    }
    //LocateNode(L,x)
    public int getIndex(T element){
        for(int i=0;i<size;++i)
            if(MySeq[i]==element)
                return i;
        return -1;
    }
    //InsertList(L,x,i)
    public void insertMySeq(T element,int index){
        if(index<0||index>size)//为size是为了能插入到最后一位空白位,而非size-1位
            throw new IndexOutOfBoundsException("IndexOutOfYourSeq");
        ensureCapacity(size+1);
        for(int i=size;i>index;--i)
            MySeq[i]=MySeq[i-1];
        MySeq[index]=element;
        size++;
    }
    private void ensureCapacity(int minCapacity) {
        // TODO Auto-generated method stub
        if(minCapacity>capacity)
            capacity>>=1;
        MySeq=Arrays.copyOf(MySeq,capacity);
    }
    public void add(T element){
        insertMySeq(element,size);
    }
    //DeleteList(L,i)
    public void DeleteMySeq(int index){
        if(index<0||index>size-1)
            throw new IndexOutOfBoundsException("IndexOutOfYourSeq");
        for(int i=index;i<size;++i)
            MySeq[i]=MySeq[i+1];
        MySeq[size-1]=null;//便于GC回收
        size--;
    }
    public String toString(){
        if(size==0)
            return "[]";
        else{
            StringBuilder str=new StringBuilder("[");
            for(int i=0;i<size;++i)
                str.append(MySeq[i].toString()+", ");//逗号加空格
            int len=str.length();
            return str.delete(len-2,len).append("]").toString();
        }
    }
}

测试用例

public class TestDemo {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SeqList<Integer> seq=new SeqList<Integer>(6);//调用T泛的方法
        int leng=seq.length();
        for(int i=0;i<leng;i++)//初始化数组元素
            seq.setValue(i+1, i);
        System.out.println(seq.toString());
        //输出[1, 2, 3, 4, 5, 6]
        seq.add(9);//添加
        System.out.println(seq.toString());
        //输出[1, 2, 3, 4, 5, 6, 9]
        seq.DeleteMySeq(3);//删除
        System.out.println(seq.toString());
        //输出[1, 2, 3, 5, 6, 9]
    }
原文地址:https://www.cnblogs.com/ksWorld/p/6740826.html