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

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

【线性表的顺序存储的结构代码 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. linux教程:[4]配置Tomcat开机启动

    http://jingyan.baidu.com/article/6525d4b1382f0aac7d2e9421.html 方法/步骤 1 请自行下载安装配置tomcat的服务器环境 本经验仅仅介绍 ...

  2. Triangles

    1010: Triangles Time Limit: 2 Sec   Memory Limit: 128 MB Submit: 18   Solved: 8 Description You are ...

  3. tomcat 虚拟目录与显示目录中文件列表

    虚拟目录: 该方法推荐使用,比较简单. 在%tomcat%\conf\Catalina\localhost(该目录可能需要手工创建)下新建一个文件abc.xml,注意文件名中的abc就表示虚拟目录的名 ...

  4. 修改 suse 上的postfix 的日志路径

    刚刚搭建的邮件服务器,没过多久硬盘就爆满了,不得已移动存储,包括日志. 移动存储灰常简单,查找 /etc/postfix/main.cf 中的 data_directory / base_direct ...

  5. <转>使用eclipse编译cocos2d-x示例项目,创建cocos2d-x android项目并部署到真机

    准备 今天将cocos2d-x的示例项目tests编译到android真机运行,以及如何创建cocos2d-x的android项目. 打开cocos2d-x的tests项目,路径为:D:\cocos2 ...

  6. 局部更新listview的问题(只更新某个item)

    转:http://blog.csdn.net/wu_shu_jun/article/details/7794576 public void updateView(int itemIndex) { // ...

  7. IOS 横屏中添加UIImagePickerController获取系统图片

    今天写ipad的项目,然后需要调用系统相册选择图片,然后用了UIImagePickerController ,崩溃了,后来查了一下,UIImagePickerController只支持竖屏,但是... ...

  8. Lazy Load 图片延迟加载(转)

    jQuery Lazy Load 图片延迟加载来源 基于 jQuery 的图片延迟加载插件,在用户滚动页面到图片之后才进行加载. 对于有较多的图片的网页,使用图片延迟加载,能有效的提高页面加载速度. ...

  9. Unescape HTML entities in Javascript Unescape HTML转成html代码

    前言: 在javascript里面动态创建标准dom对象一般使用: var obj = document.createElement('div'); 然后再给obj设置一些属性. 但是,在实际使用过程 ...

  10. [006]为什么C++会被叫做是C++?

    先了解一下自增和自减的运算符: 自增(++)和自减(--)操作符为对象提供加1或减1操作: int i = 0, j; j = ++i; // j = 1, i = 1: prefix yields ...