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


    数据结构:

      数据按逻辑结构分类有:

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

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

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

        (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]
        }
    复制代码
  • 相关阅读:
    Dllimport函数時无法在Dll中找到的入口点
    cb35a_c++_STL_算法_for_each
    cb34a_c++_STL_算法_查找算法_(7)_lower_bound
    cb33a_c++_STL_算法_查找算法_(6)binary_search_includes
    cb32a_c++_STL_算法_查找算法_(5)adjacent_find
    cb31a_c++_STL_算法_查找算法_(4)find_first_of
    cb30a_c++_STL_算法_查找算法_(3)search_find_end
    cb29a_c++_STL_算法_查找算法_(2)search_n
    cb28a_c++_STL_算法_查找算法_(1)find_find_if
    cb27a_c++_STL_算法_最小值和最大值
  • 原文地址:https://www.cnblogs.com/xieyulin/p/7061218.html
Copyright © 2020-2023  润新知