zoukankan      html  css  js  c++  java
  • 线性表之顺序存储结构

    第三章

    线性表:零个或多个数据元素的有限序列。

    若将线性表标记为(a1,a2,...ai-1,ai,ai+1,...,an),

    当i=1,2,...n-1时,ai有且仅有一个直接后继,

    当i=2,3,...,n时,ai有且仅有一个直接前驱。

    线性表的抽象数据类型:

    《大话数据结构》中是C语言版,这里是java版的。

    基本操作:

    1)线性表的制空操作:  clear()

    2)线性表判空操作:     isEmpry()

    3)求线性表的长度:     length()

    4)取元素操作:          get(i)

    5)插入操作:             insert(i,x)

    6)删除操作:             remove(i)

    7)查找操作:             indexOf(x)

    8)输出操作:             display()

    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);
        public void remove(int i);
        public int indexOf(Object x);
        public void display();
    }

    可继续参考:http://blog.csdn.net/sdliujiangbo/article/details/8068570

     例子:A并B代码:

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.List;
    
    
    public class AandB {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            List<Integer> A = new ArrayList<Integer>(Arrays.asList(3,5,8,11));
            List<Integer> B = new ArrayList<Integer>(Arrays.asList(2,6,8,9,11,15,20));
            System.out.println("集合A:"+A);        
            System.out.println("集合B:"+B);    
            List<Integer> tmp = new ArrayList<Integer>(B);
            tmp.removeAll(A);
            System.out.println("集合B-A:"+tmp);    
            List<Integer> result = new ArrayList<Integer>(A);
            result.addAll(tmp);
            System.out.println("集合B-A+A(去掉重复值):"+result);
    
            A.addAll(B);
            Collections.sort(A);
            System.out.println("A+B(保留重复值按序排列):"+A);
        }
    }
    View Code

     线性表的顺序存储结构:用一段地址连续的存储单元依次存储线性表的数据元素。

    顺序存储结构需要三个属性:

    1)存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置。

    2)线性表的最大存储容量:数组长度MaxSize.

    3)线性表的当前长度:length.

     注意区别:数组长度&&线性表长度

    数组长度:存放线性表的存储空间的长度,存储分配后这个量一般不变的。

    线性表长度:线性表中数据元素的个数,随着线性表插入和删除操作的进行,这个量是变化的。

    在任意时刻,线性表的长度应该小于等于数组的长度。

    地址计算方法:

    假设每个数据元素占用c个存储单元,那么线性表中第i+1个数据元素的存储位置和第i个数据元素的存储位置满足下列关系。(LOC表示获得存储位置的函数)

    LOC(ai+1)=LOC(ai)+c

    所以对于第i个数据元素ai的存储位置可以由ai推算出:

    LOC(ai)=LOC(a1)+(i-1)*c

    顺序结构的插入与删除

    1、获得元素的操作

    2、插入操作

    插入算法的思路:

    1)如果插入位置不合理,抛出异常;

    2)如果线性表长度大于等于数组长度,则抛出异常或动态增加容量;

    3)从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置;

    4)将要插入元素填入位置i处;

    5)表长加1.

    实现代码:

    public boolean insertElem(int i, T t) {  
            if(length == MAXSIZE) { //线性表已经满了  
                System.out.println("该线性表已经满了");  
                return false;  
            }  
              
            if(i < 1 || i > MAXSIZE) {    //插入位置不在范围内  
                System.out.println("该位置不合法");  
                return false;  
            }  
              
            if(i < length) { //插入位置不在表尾  
                  
                for(int j = length; j >= i; j--) {   //将要插入位置后数据元素向后移动一位  
                    data[j] = data[j - 1];  
                }  
            }  
            data[i - 1] = t;    //插入新元素  
            length++;   //线性表长度增加  
            return true;  
        }  
    View Code

    3、删除元素

    删除算法的思路:

    1)如果删除位置不合理,抛出异常;

    2)取出删除元素;

    3)从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置;

    4)表长减1.

    //删除元素  
        public T deleteElem(int i) {  
              
            if(length == 0) {   //"线性表为空"  
                System.out.println("线性表为空");  
                return null;   
            }  
      
            if(i < 1 || i > length) { //删除位置不在范围内  
                System.out.println("该位置不合法");  
                return null;  
            }  
            T t = data[i -1];  
            for(int j = (i - 1); j <= (length - 1); j++) {  
                data[j] = data[j+1];  
            }  
            length--;//线性表长度减少  
            return t;  
              
        }  
          
    删除操作代码

    线性表的顺序存储结构,在存,取数据时间复杂度都是O(1)

    而插入或删除时,时间复杂度都是O(n)。

    线性表顺序存储结构的优缺点:

    优点:

    ·无须为表示表中元素之间的逻辑关系而增加额外的存储空间

    ·可以快速地存取表中任意位置的元素。

    缺点:

    ·插入和删除操作需要移动大量元素

    ·当线性表长度变化大时,难以确定存储空间的容量

    ·造成存储空间的”碎片“

    java数据结构之线性表代码实现:http://blog.csdn.net/yaerfeng/article/details/38293401

    线性表的顺序存储结构(java版):http://hjj20040849.iteye.com/blog/1816838

  • 相关阅读:
    Spring MVC实现QQ第三方登录 博客分类: spring
    Ajax Post提交事例及SpringMVC注解@RequestMapping取不到参数值解决办法
    js注册检测 用户名、密码、手机号、邮箱
    SpringMVC介绍之Validation
    菜鸟级springmvc+spring+mybatis整合开发用户登录功能(上)
    通过Ajax post Json类型的数据到Controller
    基于SpringMVC与jquery的ajax提交表单的若干情况详解
    jquery ajax提交表单数据的两种方式
    SpringMVC 返回字符串
    后台数据库优化——板机
  • 原文地址:https://www.cnblogs.com/cailingsunny/p/4556042.html
Copyright © 2011-2022 走看看