顺序表
顺序表的存储结构:
(严蔚敏版)
#define LIST_INT _SIZE 100//线性表存储空间的初始分配量
#define LISTINTCRMENT 10 //线性表存储空间的增量
typedef struct
{
ElemType *elem;//存储空间基址
int Length;//当前长度
int Listsize;//当前分配的存储容量
}sqlist;
|
|
|
|
…………… |
|
如图,每个格子就是代表一块单元内存。
这些所有的格子,就是LIST_INT_SIZE,也就是存储空间的初始分配量假设100;
而它的基址,也就是elem就是指向第一个格子的。此时Length是等于0的,初始化后,并没有加入东西,所以当前长度为0.而Listsize当前分配的存储容量,也就是100,LIST_INT_SIZE.
|
A0 |
A1 |
A2 |
…………… |
|
如果放入了一个长度为Length=3的数据,当前长度就是3。然后,假如我又增加了150个数据,可是最大才100,不够了,那顺序表就会再分配若干个SISTINTCRMENT长度的内存。比如这个例子中,3+150=153>100,153-100=53,也就是说,它会分配60个内存。这就是动态数组,我觉得只要大小这一点攻克了,和链表一样。当然,链表的插入删除等方便,不需要移动元素,时间复杂度高,而顺序表,牵一发动全身。但是对于查找等,顺序表又很方便,只要知道某一个,就能找到其他 的所有。
我刚才回来重新看才发觉以前理解不对!以前我一直以为,所谓的动态,就是初始时分配一个足够大的内存,像这个表中就是说LIST_INT_SIZE=100000000,就是很大很大,远远超出实际所需。但是又有别于一般的数组,我以为这个很大的内存,没有使用的时候,它是自由的,可以被其他 所需要的使用,但是如果它需要了,就会自动有最大个数以下的内存等它使用。
既然想错了,就要明白真正的原理:应该就是定义了一个指向数组的指针。当当前长度有变化时,指针就在数组上移动,如果指针指向了数组的最后一个元素,也就是当前容量,但是还有数据需要指针寻,怎么办呢?我估计,一旦指针的下一个为空,就会返回指令给系统,系统就会分配先前设置好的某个长度的内存块,比如这里就是LISTINTCRMENT=10,就是一旦指针到了最后就加配10个内存。假如分配单位内存后还是不够,那指针又到了最后,就继续循环下去。换言之,也就是通过指针把新生成连续内存,也就是数组接到原来的数组上。

浙公网安备 33010602011771号