浅析线性表的原理及简单实现

一、线性表

原理:零个或多个同类数据元素的有限序列

原理图:

特点 :

1、有序性

2、有限性

3、同类型元素

4、第一个元素无前驱,最后一个元素无后继,中间的元素有一个前驱并且有一个后继

线性表是一种逻辑上的数据结构,在物理上一般有两种实现 顺序实现和链表实现

二、基于数组的 线性表顺序实现

原理 : 用一段地址连续的存储单元依次存储线性表数据元素。

原理图:

算法原理:

1、初始化一个定长的数组空间 elementData[] , size 存储长度 存储元素

2、通过索引来快速存取元素

3、通过数组复制实现元素的插入和删除

实现代码:

接口定义:

 1 package online.jfree.base;
 2
 3 /**
 4  * author : Guo LiXiao
 5  * date : 2017-6-14  11:46
 6  */
 7
 8 public interface LineList <E>{
 9
10     /**
11      * lineList 是否为空
12      * @return
13      */
14     boolean isEmpty();
15
16     /**
17      * 清空 lineList
18      */
19     void clear();
20
21     /**
22      * 获取指定位置元素
23      * @param index
24      * @return
25      */
26     E get(int index);
27
28     /**
29      * 获取元素第一次出现的位置
30      * @param e
31      * @return
32      */
33     int indexOf(E e);
34
35     /**
36      * 判断 lineList是否包含指定元素
37      * @param e
38      * @return
39      */
40     boolean contains(E e);
41
42     /**
43      * 设置指定位置数据,如数据已存在 则覆盖原数据
44      * @param index
45      * @param e
46      * @return
47      */
48     E set(int index, E e);
49
50     /**
51      * 移除指定位置元素
52      * @param index
53      * @return
54      */
55     E remove(int index);
56
57     /**
58      * 在lineList结尾插入元素
59      * @param e
60      * @return
61      */
62     E add(E e);
63
64     /**
65      * 在index后面插入元素
66      * @param index
67      * @param e
68      * @return
69      */
70     E add(int index, E e);
71
72     /**
73      * 返回lineList长度
74      * @return
75      */
76     int size();
77
78
79
80 }

算法实现:

  1 package online.jfree.base;
  2
  3 /**
  4  * author : Guo LiXiao
  5  * date : 2017-6-15  13:44
  6  */
  7
  8 public class OrderedLineList<E> implements LineList<E> {
  9
 10     private static final int INIT_CAPACITY = 10;
 11
 12     private transient E[] elementData;
 13
 14     private transient int elementLength;
 15
 16     private int size;
 17
 18     public OrderedLineList() {
 19         this(0);
 20     }
 21
 22     public OrderedLineList(int initCapacity) {
 23         init(initCapacity);
 24     }
 25
 26     private void init(int initCapacity) {
 27         if (initCapacity >= 0) {
 28             this.elementData = (E[]) new Object[initCapacity];
 29             this.elementLength = initCapacity;
 30         } else {
 31             throw new IllegalArgumentException("Illegal Capacity: " +
 32                     initCapacity);
 33         }
 34         this.size = 0;
 35     }
 36
 37     /**
 38      * 扩容
 39      */
 40     private void dilatation() {
 41         int oldCapacity = this.elementLength;
 42         int newCapacity = oldCapacity;
 43         if (oldCapacity <= this.size) {
 44             newCapacity = oldCapacity + INIT_CAPACITY;
 45         }else if(oldCapacity - INIT_CAPACITY > this.size){
 46             newCapacity = oldCapacity - INIT_CAPACITY;
 47         }
 48         if (oldCapacity != newCapacity){
 49             E[] newElementData = (E[]) new Object[newCapacity];
 50             System.arraycopy(elementData, 0, newElementData, 0, oldCapacity);
 51             this.elementLength = newCapacity;
 52             this.elementData = newElementData;
 53         }
 54     }
 55
 56     /**
 57      * 校验列表索引越界
 58      * @param index
 59      */
 60     private void checkCapacity(int index){
 61         if (index > this.size - 1 || index < 0)
 62             throw new IndexOutOfBoundsException(new StringBuffer("[index : ").append(index).append("] , [size : ").append(size).append("] ").toString());
 63     }
 64
 65     @Override
 66     public boolean isEmpty() {
 67         return this.size == 0;
 68     }
 69
 70     @Override
 71     public void clear() {
 72         this.init(0);
 73     }
 74
 75     @Override
 76     public E get(int index) {
 77         this.checkCapacity(index);
 78         return this.elementData[index];
 79     }
 80
 81     @Override
 82     public int indexOf(E e) {
 83         for (int i = 0; i < this.size; i++){
 84             if (e == null && elementData[i] == null || e.equals(elementData[i])){
 85                 return i;
 86             }
 87         }
 88         return -1;
 89     }
 90
 91     @Override
 92     public boolean contains(E e) {
 93         return this.indexOf(e) > 0;
 94     }
 95
 96     @Override
 97     public E set(int index, E e) {
 98         this.checkCapacity(index);
 99         this.dilatation();
100         E oldElement = this.elementData[index];
101         this.elementData[index] = e;
102         return oldElement;
103     }
104
105     @Override
106     public E remove(int index) {
107         this.dilatation();
108         E e = elementData[index];
109         if (index == size - 1) elementData[index] = null;
110         else {
111             int length = size - index - 1;
112             System.arraycopy(elementData, index + 1, elementData, index, length);
113         }
114         size --;
115         return e;
116     }
117
118     @Override
119     public E add(E e) {
120         return this.add(size, e);
121     }
122
123     @Override
124     public E add(int index, E e) {
125         this.dilatation();
126         if (index == size) elementData[index] = e;
127         else {
128             index++;
129             int lastLength = size - index;
130             E[] lastElementData = (E[]) new Object[lastLength];
131             System.arraycopy(elementData, index, lastElementData, 0, lastLength);
132             elementData[index] = e;
133             System.arraycopy(lastElementData, 0, elementData, index + 1, lastLength);
134         }
135         size ++ ;
136         return e;
137     }
138
139     @Override
140     public int size() {
141         return this.size;
142     }
143
144 }

时间: 2024-10-10 22:22:50

浅析线性表的原理及简单实现的相关文章

数据结构与算法—线性表详解

前言 通过前面数据结构与算法前导我么知道了数据结构的一些概念和重要性,那么我们今天总结下线性表相关的内容.当然,我用自己的理解解分享给大家. 其实说实话,可能很多人依然分不清线性表,顺序表,和链表之间的区别和联系! 线性表:逻辑结构, 就是对外暴露数据之间的关系,不关心底层如何实现. 顺序表.链表:物理结构,他是实现一个结构实际物理地址上的结构.比如顺序表就是用数组实现.而链表用指针完成主要工作.不同的结构在不同的场景有不同的区别. 对于java来说,大家都知道List接口类型,这就是逻辑结构,

线性表的查找

查找基本概念 查找,也可称检索,是在大量的数据元素中找到某个特定的数据元素而进行的工作. 线性表的查找 在查找表中.线性表查找是最简单的一种,基本的操作为顺序查找和折半查找. 顺序查找:从表的一端開始.依次将查找的keyword与给定数据库进行批对,若keyword在给定数据库中存在.则查找成功.否则当数据库从头到尾没有批对到.则查找失败. 作用范围:即使用线性表的顺序存储又适合于线性表的链式存储结构. 数据元素类型定义 typedef struct{ KeyType key. //keywor

数据结构与算法——线性表顺序存储结构

今天总结一下数据结构中的线性表中的顺序存储结构,这是一种比较简单的结构. 首先,看一下什么是线性表. 什么是线性表? 线性表是一种简单的数据结构,数据元素之间是一对一的关系,即除了第一个和最后一个元素外其余元素都是首尾相接的.元素的个数称为线性表的长度,长度为零则表示线性表为空. 什么是线性表的循序存储结构? 线性表中的顺序存储结构就是把线性表中的元素按逻辑次序依次存放在一组地址连续的存储空间中,也把这种线性表称为顺序表.根据顺序表的特点,通常是用数组来存储元素的. 下面就看具体的实现(C++)

线性表 及Java实现 顺序表、链表、栈、队列

数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值,至少在一段时间之后,技术可以很快得到提高.同时,它也是软考的重点,我们需要对这部分的内容进行一下总结. 我们先看一下数据结构和算法的整体内容. 1.线性表 概念: 数据元素的排列方式是线性的. 分类: 分类规则是根据上图中元素的存储结构来划分的. (1)顺序表 基本思想:元素的存储空间是连续的.在内

skiplist(跳表)的原理及JAVA实现

前记 最近在看Redis,之间就尝试用sortedSet用在实现排行榜的项目,那么sortedSet底层是什么结构呢? "Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单.”   那么什么是SkipList跳表呢?下面我们从理解它的思想到实现及应用去做一个大致

Java数据结构与算法(1):线性表

线性表是一种简单的数据类型,它是具有相同类型的n个数据元素组成的有限序列.形如如A0,A1,...,An-1.大小为0的表为空表,称Ai后继Ai-1,并称Ai-1前驱Ai. printList打印出表元素,makeEmpty置空表,find返回某一项首次出现的位置,insert和remove一般是从表的某个位置插入和删除某个元素:而findKth则返回某个位置上的元素,next和previous会取一个位置作为参数返回前驱元和后继元的值. 表的数组实现 对表的所有操作都可以通过数组实现.数组的存

c语言描述简单的线性表,获取元素,删除元素,

1 //定义线性表 2 #define MAXSIZE 20 3 typedef int ElemType; 4 typedef struct 5 { 6 ElemType data[MAXSIZE]; //这是数组的长度,从0开始,也就是最大长度 7 int length; //这是线性表的长度,表示线性表已经存储了多少个元素 8 9 }SqList; 10 /* 11 ************************** 12 ************************** 13 */

数据结构学习1:实现一个简单的线性表功能

数据结构: 一个简单的线性表的实现 学习了数据结构有一段时间了,那是半年前老师课堂上讲的,最后由于一些原因,没能听到最后,前几天在写一些算法的时候,发现自己的数据结构还是太渣了,因此便又拿起了那本很有价值的数据结构的书,重新来啃这本厚厚的书,数据结构在我们编程中是非常的重要的,希望这次的学习能有一个好的开头,并且能在这个过程中有所得吧! 下面是我写的一个简单的线性表的实现: #include"stdafx.h" #include<iostream> using namesp

简单数据结构(一)线性表

最简单的结构:线性表 先进先出的结构:队列 先进后出的结构:栈 线性表 线性表数据结构具有以下特征:   有且只有一个"首元素"   有且只有一个"末元素"   除末元素之外,其余元素均有惟一的后继元素   除首元素之外,其余元素均有惟一的前驱元素 对于线性表,主要可进行以下操作:   添加结点   插入结点   删除结点   查找结点   遍历结点   统计结点数 其中线性表也分为:顺序表 and 链表 顺序表:在计算机内,保存线性表最简单.最自然的方式,就是把表