线性表之顺序存储结构

第三章

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

若将线性表标记为(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

posted @ 2015-06-06 08:46  七彩木兰  阅读(434)  评论(0编辑  收藏  举报