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

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

【线性表的顺序存储的结构代码 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. 委托、匿名函数、Lambda表达式和事件的学习

    委托: 还记得C++里的函数指针么?大家可以点击这里查看一下以前的笔记.C#的委托和C++中的函数指针效果一致. 当我们需要将函数作为对象进行传递和使用时就需要用到委托. 下面我们看一个例子: usi ...

  2. 剑指OFFER之复杂链表的复制(九度OJ1524)

    题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点). 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一 ...

  3. Tokumx 安装指南(做法如同MongoDB)

    安装说明系统环境:Centos-6.3安装软件:mongodb-linux-x86_64-2.2.2.tgz下载地址:http://www.mongodb.org/downloads安装机器:192. ...

  4. Android设计模式—策略模式

    1.策略模式概念 定义一系列算法,把他们独立封装起来,并且这些算法之间可以相互替换.策略模式主要是管理一堆有共性的算法,客户端可以根据需要,很快切换这些算法,并且保持可扩展性. 策略模式的本质:分离算 ...

  5. SUSE的SSHD配置及设置防火墙

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  6. C++中str1::function和bind

    在C++的TR1中(TechnologyReport)中包括一个function模板类和bind模板函数,使用它们能够实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类的非静态成员函数 ...

  7. 让DataGridView显示行号

          http://www.cnblogs.com/JuneZhang/archive/2011/11/21/2257630.html 为了表示行号,我们可以在DataGridView的RowP ...

  8. Tricks Device (hdu 5294 最短路+最大流)

    Tricks Device Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To ...

  9. spring mvc+ajax分页

    分页大致思路:页面每次把当前页传到后台并获得从后台传过来的json数据,解析后布局到这个页面上. 1.服务端代码: @Controller public class MemcachedContrlle ...

  10. android122 zhihuibeijing 主页面使用fragment搭建

                                        fragment的生命周期: onAttach()当fragment添加进Activity的时候调用(这个时候Activity对 ...