【线性表的顺序存储从结构】

指的是用一段连续的存储单元一次储存线性表的数据元素。

【线性表的顺序存储的结构代码 C语言版】

#define MAXSIZE 20               /*存储空间初始分配量*/
typedef int ElemType; /*ElemType类型依实际情况而定*/
typedef struct
{
Element data[MAXSIZE]; /*数组存储数据元素,最大值为MAXSIZE*/
int length; /*线性表当前长度为length*/
}SqlList;

【线性表的顺序存储结构需要的三个属性】

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

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

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

【数组长度和线性表长度的区别】

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

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

当然,任意时候线性表的长度是小于数组的长度的。

【地址的计算方法】

存储器中的每个存储单元都有自己的编号,这个编号称为地址。

由于每个数据元素,不管是什么类型,都需要占用一定的存储空间的,假设占用的是c个存储单元,那么线性表中第i+1个数据元US的存储位置和第i个数据元素的存储位置满足下列关系:(LOC表示获得存储位置的函数)

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

【java描述顺序线性表】

【整体工程截图】

【线性顺序表抽象数据类型 JAVA接口 描述】

package com.Higgin.List;

public interface MyList<E> {
int size(); //返回线性表中的元素数量
boolean isEmpty(); //判断线性表是否为空
void clear(); //将线性表清空
E get(int index); //返回线性表的第index个元素
int indexOf(Object o); //在线性表中查找与给定元素o相等的元素,查找成功,则返回对应的序号;否则,返回-1表示失败
boolean add(E e); //向线性表的尾部添加指定的元素e
void add(int index,E element); //向线性表的指定位置第index处添加指定的元素
E remove(int index); //移除线性表的第index处的元素,返回删除的元素的值
}

【具体的实现类】

package com.Higgin.List;

public class MyArrayList<E> implements MyList{
private int size;
private Object[] elementData; /**
* 构造一个容量为initialCapacity的空顺序线性表
*/
public MyArrayList(int initialCapacity){
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
this.elementData=new Object[initialCapacity];
} /**
* 返回线性表中的元素数量
*/
public int size() {
return size;
} /**
* 判断线性表是否为空
*/
public boolean isEmpty() {
return size==0;
} /**
* 将线性表清空
*/
public void clear() {
for(int i=0;i<size;i++){ //所有元素置为null
elementData[i]=null;
}
size=0; //线性表长度置为0
} /**
* 返回线性表的第index个元素
*/
public Object get(int index) {
if(index<0||index>=this.size){
throw new IndexOutOfBoundsException("Index: "+index+", Size: "+this.size);
}
return elementData[index];
}
/**
* 在线性表中查找与给定元素o相等的元素,查找成功,则返回对应的序号;否则,返回-1表示失败
*/
public int indexOf(Object o) {
if(o==null){
for(int i=0;i<size;i++){
if(elementData[i]==null){
return i;
}
}
}else{
for(int i=0;i<size;i++){
if(o.equals(elementData[i])){
return i;
}
}
}
return -1;
}
/**
* 向线性表的尾部添加指定的元素e
*/
public boolean add(Object e) {
add(size,e);
return true;
}
/**
* 向线性表的指定位置第index处添加指定的元素
*/
public void add(int index, Object element) {
if (index > size || index < 0) //当index不在范围内
throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size);
if(index<size){ //若插入的位置不在表尾
for(int i=size;i>=index;i--){
elementData[i+1]=elementData[i];
}
}
elementData[index]=element;
size++;
}
/**
* 移除线性表的第index处的元素,返回删除的元素
*/
public E remove(int index) {
if(size==0){ //如果此时线性表为空
throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size);
}
if (index >= size||index<0) //如果移除的位置超出范围
throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size);
E oldValue=(E) elementData[index]; //存储被删除的值
if(index<size-1){ //如果删除的位置不是最后的位置
for(int i=index;i<size;i++){
elementData[i]=elementData[i+1];
}
}
elementData[size] = null; //表尾元素置为null
size--;
return oldValue;
}
}

【思路:关于 插入】

1.如果插入的位置不合理,抛出异常。

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

3.从最后一个元素开始向前遍历到底index个位置,分别将他们向后移动1个位置(包括index位置)。

4.将要插入的元素填入位置index处。

5.表长size要加1。

【思路:关于删除】

1.如果表长度为0或删除的位置不合理,抛出异常。

2.取出要删除的元素。

3.从删除的元素的位置index处开始遍历到最后一个元素,分别将他们向前移动一个位置。

4.原先最后一个元素的位置要置为null。

5.表长size要减1。

【分析:线性表顺序存储结构的优缺点】

【优点】

1.无需为表中的元素之间的逻辑关系增加额外的存储空间(相对于链表)。

2.可以快速的取出表中任意位置的元素。

【缺点】

1.插入和删除操纵需要移动大量的元素,时间复杂度O(n)

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

3.会造成存储空间“碎片”。

2.2_线性表的顺序存储结构_参考集合ArrayList的更多相关文章

  1. 线性表的顺序存储结构——java

    线性表的顺序存储结构:是指用一组地址连续的存储单元一次存放线性表的元素.为了使用顺序结构实现线性表,程序通常会采用数组来保存线性中的元素,是一种随机存储的数据结构,适合随机访问.java中ArrayL ...

  2. C++编程练习(1)----“实现简单的线性表的顺序存储结构“

    线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素. 故可以用数组来实现顺序存储结构. 用C++编写的利用数组实现简单的读取.插入和删除功能的线性表. #include< ...

  3. 线性表的顺序存储结构之顺序表类的实现_Java

    在上一篇博文——线性表接口的实现_Java中,我们实现了线性表的接口,今天让我们来实现线性表的顺序存储结构——顺序表类. 首先让我们来看下顺序表的定义: 线性表的顺序存储是用一组连续的内存单元依次存放 ...

  4. 数据结构4:顺序表(线性表的顺序存储结构)及C语言实现

    逻辑结构上呈线性分布的数据元素在实际的物理存储结构中也同样相互之间紧挨着,这种存储结构称为线性表的顺序存储结构. 也就是说,逻辑上具有线性关系的数据按照前后的次序全部存储在一整块连续的内存空间中,之间 ...

  5. c数据结构 -- 线性表之 顺序存储结构 于 链式存储结构 (单链表)

    线性表 定义:线性表是具有相同特性的数据元素的一个有限序列 类型: 1:顺序存储结构 定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构 算法: #include <stdio. ...

  6. 线性表之顺序存储结构(C语言动态数组实现)

    线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3....an) 链 ...

  7. c语言数据结构之线性表的顺序存储结构

    线性表,即线性存储结构,将具有“一对一”关系的数据“线性”地存储到物理空间中,这种存储结构就称为线性存储结构,简称线性表. 注意:使用线性表存储的数据,要求数据类型必须一致,线性表存储的数据,要么全不 ...

  8. 【Java】 大话数据结构(1) 线性表之顺序存储结构

     本文根据<大话数据结构>一书,实现了Java版的顺序存储结构. 顺序存储结构指的是用一段地址连续的存储单元一次存储线性表的数据元素,一般用一维数组来实现. 书中的线性表抽象数据类型定义如 ...

  9. 线性表 linear_list 顺序存储结构

    可以把线性表看作一串珠子 序列:指其中的元素是有序的 注意last和length变量的内在关系 注意:将元素所占的空间和表长合并为C语言的一个结构类型 静态分配的方式,分配给一个固定大小的存储空间之后 ...

随机推荐

  1. oracle下的OVER(PARTITION BY)函数介绍

    转自:http://www.cnblogs.com/lanzi/archive/2010/10/26/1861338.html OVER(PARTITION BY)函数介绍 开窗函数          ...

  2. 【STL源码学习】STL算法学习之一

    第一章:引子 STL包含的算法头文件有三个:<algorithm><numeric><functional>,其中最大最常用的是<algorithm>, ...

  3. 针对 .NET 框架的安全编码指南

      此主题尚未评级 - 评价此主题 发布日期 : 10/9/2004 | 更新日期 : 10/9/2004 Microsoft Corporation 适用于: Microsoft .NET 框架 摘 ...

  4. DRM加密技术是怎么一回事

    有时我们在播放从网上下载的影视文件时会要求输入用户许可证,否则就不能正常播放,听说是用了一种DRM技术,请简单介绍一下. 答:通常这是利用了多媒体DRM加密技术保护版权(DRM是数字权限管理技术的缩写 ...

  5. getJSON的用法

    一.方法定义:jQuery.getJSON( url, data, callback ) 通过get请求得到json数据 ·url用于提供json数据的地址页 ·data(Optional)用于传送到 ...

  6. 2015北京网络赛 J Clarke and puzzle 求五维偏序 分块+bitset

    Clarke and puzzle Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/contest/acmicpc20 ...

  7. 跟我学solr---吐槽一下,我的文章被抄袭啦

    今天闲来无事,就在在百度上搜了下面"跟我学solr",看看这几周来自己的努力成果怎么样,不搜还好,搜了就图学了.被原封不动地抄袭了!并且抄袭的文章还在百度排名第一,我自己的却被排到 ...

  8. 信号之sigpending函数

    sigpending函数返回信号集,其中的各个信号对于调用进程是阻塞的而不能递送,因而也一定是当前未决的.该信号集通过set参数返回.(这些信号是已经产生的信号,但因为信号屏蔽字中对其设置了屏蔽位,从 ...

  9. REM 注释

    REM 是DOS批处理和VB的注释语句.所谓注释语句,就是程序的执行时会跳过该行(不管它后面写的什么),它为编程者起到一个批注的功能,以达到好的可读性以便于交流以及起到备忘作用. 在批处理命令中如果不 ...

  10. Database API

    Database API Introduction Basic Usage Selects Joins Aggregates Raw Expressions Inserts Updates Delet ...