顺序表

Java数据结构-线性表之顺序表ArrayList

╄→尐↘猪︶ㄣ 提交于 2020-01-24 19:06:56
线性表的顺序存储结构。也称为 顺序表 。指用 一段连续的存储单元 依次存储线性表中的数据元素。 依据顺序表的特性,我们用数组来实现顺序表,以下是我通过数组实现的Java版本号的顺序表。 package com.phn.datestructure; /** * @author 潘海南 * @Email 1016593477@qq.com * @TODO 顺序表 * @date 2015年7月16日 */ public class FOArrayList<E> { // 顺序表长度 private int size; // 顺序表默认数组为null private Object[] data = null; // 顺序表中数组的初始化长度 private int capacity; // 顺序表默认初始化长度 private static final int DEFUALT_INITIAL_SIZE = 0; /** * 默认无參构造函数 */ public FOArrayList() { this(DEFUALT_INITIAL_SIZE); } /** * @TODO 带參构造函数 * @param initialSize 初始化顺序表长度 */ public FOArrayList(int initialSize) { if (initialSize < 0) { throw

Java实现顺序表

一笑奈何 提交于 2020-01-24 19:03:11
一、分析   什么是顺序表?顺序表是指用一组地址连续的存储单元依次存储各个元素,使得在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中的线性表。一个标准的顺序表需要实现以下基本操作:   1、初始化顺序表   2、销毁顺序表   3、清空顺序表   4、检测顺序表是否为空   5、返回顺序表的元素个数   6、返回顺序表中指定位置元素的值   7、返回顺序表中第一个与指定值相同的元素的位置   8、返回指定元素的直接前驱   9、返回指定元素的直接后继   10、向指定位置插入元素   11、删除指定位置的元素   12、遍历顺序表   在Java中,可以借助数组来表示一组地址连续的存储单元,通过对数组进行操作来表示对顺序表进行操作。我们可以将顺序表定义成一个类,将顺序表的基本操作定义成类的方法,初始化顺序表就是将这个类实例化成对象,销毁顺序表就是销毁对象。 二、实现 1、定义类属性和构造函数 1 class InitList{ 2 3 private int length; //顺序表长度,表示顺序表中的元素个数 4 5 private int [] list; //数组,顺序表主体 6 7 public InitList(int max){ //构造函数,用来初始化顺序表时定义顺序表的最大长度 8 this.list = new int[max]; 9 this.length

线性表的顺序存储结构

蹲街弑〆低调 提交于 2020-01-24 18:54:07
顺序存储结构封装需要三个属性: 1.存储空间的起始位置,数组data,它的存储位置就是线性表存储空间的存储位置 2.线性表的最大存储容量,数组的长度MaxSize 3.线性表的当前长度:length 当前长度与数组长度区别:数组长度就是该顺序表的总长度,如果不进行扩容的话,就是不变的。而当前长度在数据的变化中,就会发生相应的变化。 PS:线性表是正常的读数方法,一下标1开始的。 存储时间性能:O(1) 性能:存取以及读取不管是在哪个位置,其时间复杂度都是O(1),而在插入还是删除其时间复杂度都是O(n) 结论:比较适合数据的存取而不适合经常性增删的情况。 顺序存储结构的优缺点 1.优点: - 无须为表示表中元素之间的逻辑关系而增加额外的存储空间 - 可以快速的存取表中任意位置的元素。 2.缺点: - 插入以及删除操作需要移动大量的元素。 - 当线性表长度变化较大时,难以确定存储空间的容量。 - 容易造成存储空间的碎片。 具体代码的实现: // 头文件部分,进行常量参数初始化 #define LIST_INT_SIZE 10 //线性顺序表初始动态分配内存大小 #define INCREAMENT 2 //线性表扩容一次性增量 #define OK 1 #define ERROW -1 #define OVERFLOW -2 #include<stdio.h> #include

线性表顺序存储与链式存储的比较

孤街醉人 提交于 2020-01-24 18:52:43
从时间的角度考虑,在按位置查找数据,或在查找元素的前驱和后继等方面,顺序存储有着较大的优势。在插入数据,删除数据时,链式存储就有较大优势,这是由于在链表中只要修改指针即可实现这些操作;而在顺序表中进行插入和删除,平均要移动表中将近一半的数据元素。 从空间的角度考虑,顺序表的存储空间是静态分配的,在程序执行之前必须规定其存储规模。而动态链表的存储空间是动态分配的,只要内存空间有空闲,就不会产生溢出。 顺序表的插入,删除操作: 在顺序表第i个元素前插入结点,需要把i到n的所有元素都向后移动一位,最后把新元素插入到第i个位置。需要注意的是,在进行移动的时候,必须是从n到i依次向后移动,如果从i到n依次向后移动,则最后i+1到n+1个位置的所有元素的值都是一样的,即原来第i个元素的值 删除第i个元素时,需要将i+1到n的所有元素依次向前移动。移动顺序与插入相反,是从前向后进行,即从i到n依次向前移动一个位置。 顺序表中查找元素,获取表长非常容易,但是要插入或删除一个元素却需要移动大量元素;相反链表中却可以方便地插入或者删除元素,但在查找元素时需要进行遍历。因此,当所涉及的问题常常需要进行查找等操作,而插入,删除操作相对较少的时候,适合采用顺序表;当常常需要进行插入,删除操作的时候,适合采用链表 顺序表的插入参考程序: insertlist(v,n,i,x)/*插入前:v[1]~v[n]*/

学会线性表,一篇就够了

左心房为你撑大大i 提交于 2020-01-24 17:33:42
线性表是最常用最典型的线性结构。 简易目录: 线性表: 逻辑特征 线性表的类型定义 存储结构 顺序存储表示 元素存储位置的计算 顺序表的基本操作实现 顺序表各算法时间复杂度的计算 C++中的参数传递 链式存储表示 单链表 双向链表 循坏链表 单链表,循坏链表和双向链表的时间效率的比较 顺序表和链表的比较 线性表的合并 用顺序表实现 用链表实现 可以看到,线性表是最基础,也是最简单的了。所以我们从线性表开始学习。 定义 :具有 相同特性 的数据元素的一个 有限 序列,例如: 逻辑特征 : 线性表的类型 ( 即 抽象数据类型,也称数据类型) 定义 : 上述的基本操作是 逻辑结构 上定义的运算,那么如何实现这些基本运算,就要先确定其存储结构。 线性表的存储以及在存储结构上各操作的实现 : 线性表的基本操作 : 操作算法中用到的预定义变量和类型 : 线性表的存储结构有四种,其中最基本两种的存储结构: 顺序存储结构和链式存储结构 线性表的 顺序存储表示 (也称为 顺序映像 ): 定义: 把逻辑上相邻的数据元素存储在物理上相邻的存储单元中。 也就是说线性表顺序存储我们可以用一维数组来表示,但由于数组长度不可动态定义 即: //错误写法 int n; scanf("%d",&n); int a[n]; 这样是不可行的,所以要想用一维数组来表示,就必须再定义一个长度,像以上一样用结构体

数据结构基础(二)——线性表之顺序存储结构

大兔子大兔子 提交于 2020-01-24 03:05:04
线性表(线性存储结构)线性表是 最基本 、 最简单 、也是 最常用 的一种数据结构。它是数据结构与算法的基础之一。例如26个英文字母表:(A,B,C,D,···,Z)或者学生基本信息表又或者十二星座的排序等等,它们都是线性表。 一.线性表的定义和特点 线性表(linear list):是 n个具有相同特性的数据元素的有限序列 。数据元素是一个抽象的符号,其具体含义在不同的情况下一般不同。 n的个数代表线性表的长度,当n = 0时,称为 空表 。 对于非空的线性表或线性结构,其 特点 是: 存在唯一的一个被称作“第一个”的数据元素; 存在唯一的一个被称作“最后一个”的数据元素; 除第一个之外,结构中的每个数据元素均只有一个前驱; 除最后一个之外,结构中的每个元素均只有一个后继; 对于前驱和后继 某一元素的左侧相邻元素称为“ 直接前驱 ”,位于此元素左侧的所有元素都统称为“ 前驱元素 ”; 某一元素的右侧相邻元素称为“ 直接后继 ”,位于此元素右侧的所有元素都统称为“ 后继元素 ”; 以图数据中的元素 3 来说,它的直接前驱是 2 ,此元素的前驱元素有 2 个,分别是 1 和 2;同理,此元素的直接后继是 4 ,后继元素也有 2 个,分别是 4 和 5。如图所示: 二.线性表的基本操作 InitList(&L) :构造一个空的线性表L。 DestroyList(&L) :销毁线性表L。

顺序表练习(四):上三角矩阵的压缩存储公式推导以及代码实现

孤者浪人 提交于 2020-01-23 05:50:19
前言 本篇博客会较为详细地讲一下我个人对三角矩阵压缩存储公式的理解,希望能给后面的朋友们带来一些帮助。 等差数列的求和公式 由于三角矩阵的压缩存储公式是依靠求和公式来推导的,所以得先补一下等差数列的求和公式。 求和公式一: 其中n是整个数列的项数, 是数列的首项,d是数列的公差(递增数列公差为正数,递减数列公差为负数)。 求和公式二: 其中n为整个数列的项数, 是数列的首项, 是数列的末项。下面主要用到这个公式二。 上三角矩阵压缩储存公式的推导 首先我们知道,压缩储存上三角矩阵,本质上就是将矩阵的上三角块的元素“展开”成一条长的数列存在数组里。问题就在于,我们 如何根据原矩阵里元素的行号和列号得到压缩后数组里对应的下标? 我们可以这样考虑: 对于一个上三角块里第i行第j列的元素 ,它在数组里的下标就等于(在原矩阵中)他前面i-1行的元素数量 + (原矩阵中)他所在行的他前面的元素数量 ,以下面这个矩阵为例, 在数组里的位置就应该是它前面两行元素的数量5+4=9,再加上 所在行它前面的元素数量1(即是 ),最终结果10即是 在数组中的位置(当然,转换成物理下标的话还需要-1)。 那么问题又来了, 我们如何才能知道前面1到i-1行的元素数量? 这个时候就要用到我们的等差数列求和公式了,我们可以从上到下地将每行的 元素数量 看成一个数列,对于上图的矩阵来说,这个数列就是5 4 3 2 1

【数据结构】班级管理系统

ぐ巨炮叔叔 提交于 2020-01-23 04:22:12
问题描述 为自己所在的班级建立一个小型的管理系统,该系统能够方便实现查询每个同学的基本情况,能够进行插入与删除操作(笔者使用文件实现上述操作)。其中:每位同学的信息包括:学号、姓名、年龄、电话以及籍贯。 一堆废话 很久没有更新博客了,小白刚刚历经考试周的打击,百废待兴,赶紧跑来CSDN和小伙伴们取暖安慰受伤的心灵。近期会陆续写四篇数据结构课设的博客,然后再写两篇编写小游戏的博客,一个是基于Python的飞机大战,另一个是基于C++并在funcode上完成的海底世界游戏。 数据描述 (1)定义一个顺序表,顺序表中的元素包括结构体类型(Stu)的数组和顺序表的长度。 (2)结构体Stu其中的元素包括学号、姓名、年龄、电话以及籍贯。 typedef struct { int number ; //学号 char name [ 100 ] ; //姓名 short age ; //年龄 char phnumber [ 100 ] ; //电话 char adr [ 100 ] ; //籍贯 } Stu ; typedef struct { Stu s [ 20 ] ; int length ; } SqList ; 程序代码 # include <stdio.h> # include <string.h> # include <stdlib.h> typedef struct { int

数据结构——顺序表

自作多情 提交于 2020-01-22 04:14:33
include<stdio.h> include<stdlib.h> define maxsize 30 typedef struct{ int data[maxsize]; int n; }Seqlist; int scanfdata(Seqlist &L){ int i,n; printf("请问要输入几个数据:"); scanf("%d",&n); if(n>maxsize){ printf("顺序表长度不够!\n"); printf("请问要输入几个数据:"); scanf("%d",&n); } L.n=n; printf("请输入数据:"); for(i=0;i<L.n;i++){ scanf("%d",&L.data[i]); } printf("顺序表长度为:"); printf("%d\n",L.n); } void printfdata(Seqlist &L){ int i; printf("输出所有数据:"); for(i=0;i<L.n;i++){ printf("%d ",L.data[i]); } printf("\n"); return; } void insert(Seqlist &L){ int a[10],b,i,c; printf("请问要插入几个元素:"); scanf("%d",&c); for(i=0;i<c;i++){ printf(

数据结构:线性表的基本操作

好久不见. 提交于 2020-01-22 01:43:25
顺序表学习:参考《大话数据结构》 涉及到顺序表的基本操作有如下: int initList(SqList *L);               /** 初始化操作,建立一个空的线性表 **/ int printList(SqList L);              /** 打印线性表中的每一个元素 **/ int getlength(SqList L);              /** 返回线性表元素的个数 **/ int createList(SqList *L,int length);        /** 创建一个链表长度为length的线性表 **/ int insertList(SqList *L, int pos,ElemType elem); /** 在线性表的第pos个位置插入 一个新元素elem **/ int getElem(SqList L, int pos, ElemType *e);   /** 将线性表中第pos个位置的元素返回,保存在*e中 **/ int locateElem(SqList L, ElemType e);       /** 在线性表中查找与给定元素e相等的元素,如果有相同的返回状态值1,如果没有,返回状态值0 **/ int deleteList(SqList *L, int pos,ElemType *elem);   /**