链表和数组(顺序表)&&LinkedList 和ArrayList

1 篇文章 0 订阅

数据结构

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
数组是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名。
在这里我们将两个结合在一起看,或许这样就会更加容易了解,认识链表、数组。
单链表
单链表的结构
数组
数组的结构

以上图一看就能很清楚的知道,如果还不能清晰的了解这两种结构的话,
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().也可以实现队列的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值