目录 |
(一)线性表的介绍 |
(二)顺序表 |
(一)线性表的介绍
- 线性表:线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…
- 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
(1)逻辑上是线性结构,物理结构连续——顺序表;
(2)逻辑上是线性结构,物理结构不连续——链表。
(二)顺序表
将表中元素一个接一个的存入一组连续的存储单元中,这种存储结构是顺序结构。
-
顺序表是线性表,逻辑结构与存储位置吻合。
-
一般采用数组存储。
-
顺序表的分类:
静态顺序表 | 使用定长数组存储 |
动态顺序表 | 使用动态开辟的数组存储 |
注:使用动态顺序表可以自由控制内存大小,避免开辟内存不够或者开辟内存过大的问题。
- 将表中元素依此存入数组
i: int[] array————存在实际数据(可以理解为一座可以容纳n各人的房子)
ii: int size————存在数据个数(可以理解为方子中实际住了多少人)
1. 头插
- 头插:即在顺序表的第一个元素之前插入一个新的元素。
- 思想:
图2:
(1)若要在第一个元素的位置插入一个新的元素,则原来所有的元素都必须后移一个位置。需后移size个元素。
(2)为了使后移的元素不被覆盖,后移的顺序用改为:从后往前移。
(3)确定空间下标 与 数据下标
数据下标:可以理解为移动前元素的下标;
空间下标:可以理解为移动以后元素的下标。
空间下标:[size,1]
数据下标:[size-1,0]
(4)array[空间下标] = array[数据下标];
数据下标=空间下标-1
(5)array[0] = 新元素;
(6)size++;
2. 尾插
- 尾插:在顺序表得最后一个元素后面添加一个元素
- 思想:
图3:
(1)顺序表中所有得元素都不需要移动,直接在最后插入一个新的元素
(2)array[size] = 新元素;
(3)size++
3. 从中间任何位置插入
- 思想:
图4:
(1)从中间任何位置插入,也包括从头插和尾插。
(2)明确要插入新元素的位置index,不能越界。(index>=0 && index <= size);
(3)将index及其之后的元素全部后移一个位置;
(4)先后移,再插入,且从后往前移动;
(5)确定空间下标[size,index+1];
(6)确定数据下标[size-1,index];
(7)array[空间下标] = array[数据下标];
数据下标=空间下标-1
(8)array[index] = 新元素;
(9)size++
4. 头删
- 头删:即把顺序表中得第一个元素删除
- 思想:
图5:
(1)删除第一个元素,则其后的元素就必须前移一个位置,需要移动的元素个数为size-1;
(2)移动顺序:从前往后;
(3)确定空间下标[0,size-2];
(4)确定数据下标[1,size-1];
(5)array[空间下标] = array[数据下标];
数据下标=空间下标+1
(6)移动完之后: this.array[–this.size] = 0。
5. 尾删
- 尾删:即删除顺序表中的最后一个元素。
- 思想:
(1)其他元素都不用移动,只需要删除最后一个元素即可
(2)this.array[–this.size] = 0;
6. 从中间任何位置删除
- 思想:
图6:
(1)确定index得位置;
(2)将该位置及之后的所有元素前移一个位置;
(3)移动顺序:从前往后移动;
(4)确定数据下标:[index+1,size-1];
(5)确定空间下标:[index,size-2];
(6)array[空间下标] = array[数据下标];
(7)移动完之后,this.array[–this.size] = 0;
7,顺序表增删的具体代码:
(1)定义接口,接口中定义要实现的方法
/**
* author:kelly_fanfan
*/
interface IArrayList {
//顺序表的增删查改
//头插
//把item插入到线性表的前面
void