数据结构
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
数组是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名。
在这里我们将两个结合在一起看,或许这样就会更加容易了解,认识链表、数组。
单链表的结构
数组的结构
以上图一看就能很清楚的知道,如果还不能清晰的了解这两种结构的话,
BZ想在这里用C语言的指针去体现这两种结构具体如何实现。
单链表:
引入
我们看上图 是不是一块 连接一块,一块是不是有两个以上一块组成一块,那么结构块如实如何定义的呢?
单链表
#include<...> #define SIZE 45 struct film{ char str[SIZE]; int index; struct film *next;//由于是单链表。 }
这样我们就能看明白,原来单链表就是后面一个关于指向下一个结构块的地址空间。
数组(顺序表):
一维数组
include<...> int mail(void){ int dates [4] = {0,1,2,3}; int * pti ; pti = dates;//数组名表示地址首位置。 for(int index=0;index<4;index++){ print("dates:%d:%d",index,*(pti+index)); }
}
我们一看就知道,原来数组就是一块连续的空间,只要得到首地址 或者其中一块 ,我们就能找到数组的地址空间了。只要加一或减一就能获取到。
随机访问,顺序访问
BZ认为随机访问,只有内存空间是连续才能做到。不过也有人提到Hash 表,也可以随机访问;引用别人的话,“主要还是看你容器的组织方式
能不能根据一个公式计算一个元素的地址,如果可以,就算物理内存不连续,也可以随机访问”,BZ也是认同的。
那么顺序访问呢,其实就是顺序的访问,一个一个的访问,从头开始到尾。即使你想直接访问中间也做不到。因为拿到一个元素的前提是拿到前面的元素,所以以此类推,只能从头开始访问。那么如果要访问单链表的链尾效率就很低了 。所以就有deque了。
其实随机访问比较难理解,连续空间 怎么随机访问呢?
顺序表
for(int index=0;index<4;index++){ print("dates:%d:%d",index,*(pti+index)); }
如果我们想直接输出第三个元素。
print(“dates:%d:%d”,index,*(pti+2));
那么肯定会疑问那个访问快呢?
如果同时遍历两个,链表当遍历第一个元素,拿到第一个元素,然后拿第二个元素还要再拿一次第一个元素。可想而知,效率很低。
LinkedList和ArrayList
LinkedList存储方式 是基于链表,而ArrayList存储方式是基于数组(顺序表)。
ArrayList:是数组结构,长度是可变的(原理是创建新数组+复制数组),查询速度很快,增删较慢,不同步的。而Vactor是实现同步的。但是现在都不用它了 因为效率太低。如果要使用同步,collections类中有相关方法可以操作。
LinkedList:是链表结构,不同步的,增删速度很快,查询速度较慢。他是实现了Deque接口,也就是有两个头。可以对两头进行操作,可以实现 堆栈的功能,push(),pop().也可以实现队列的功能。