首页 > 编程知识 正文

列表和链表的区别,c语言链表有什么用

时间:2023-05-05 14:27:42 阅读:31814 作者:162

数组

数组定义:一个规则元素数组,命名一组相同类型的有限变量后,该变量将成为数组。

用java表示int型序列int[] temp=new int[8]; 初始化的数组中包含int类型的值,表示数组的长度为8。

1 .数组是规则元素的集合。 在内存分配中,数组必须首先分配连续的内存地址。 想象一下,数组就像一个连续0标签的楼梯。 要知道是放在哪个楼梯上的,你只需要知道这个楼梯下面的标签,直接去这个标签的楼梯拿东西就可以了。 你不需要知道其他楼梯上的标签和什么,也不需要从第一个楼梯开始按顺序找。

2 .数组之间由下标维持。 数组支持随机搜索。 例如,如果要查找索引为7的值,则只需在数组的下标中找到索引为7,就可以找到相应的值。 如果下标为7的值为90,则temp[7]=90; 因此,数组查询速度快是o(1)的时间复杂性。

3 .找完之后,添加和修改数组怎么样? 现在需要在楼梯索引为2和3的地方添加楼梯。 我该怎么办? 那么,索引只能将3和更高版本的楼梯向后移动一位,将原始长度为8的楼梯更改为长度为9的楼梯。 图中红色为正索引为3的楼梯,后面的颜色较深的是索引: 3、4、5、6、7的楼梯索引1向后移动一位,结果是索引: 4、5、6、7、8的楼梯,楼梯内容不变。 红色前面的是index为3的前面的index 1。最坏的结果是,如果在数组的开头添加一级楼梯,则整个楼梯(数组)将向后移动一级,时间复杂度为o(n )。 那么,在数组末尾添加一层越多,数组的长度直接为1就越好。 时间的复杂性是o(1)。 一般来说,数组的新修改需要移动数组,效率很低。

4 .数组删除元素。 如果必须删除上面3加上的索引值为3的步骤,则必须将索引值与3后的索引值进行一位数的提升。 也就是说,将索引: 4、5、6、7、8的值-1更改为: 3、4、5、6、7,就像图中所示的那样,最坏的情况是删除

5 .数组如果申请的空间长度不够,扩展时会重新申请连续的内存空间,不利于扩展。

链表

链表—一种物理存储单元上的非连续、非顺序存储结构,数据元素的逻辑顺序通过链表中指针链接的顺序实现。

1 .图中显示了单链表。 目前只讨论单链表的数据结构。 链表在内存分配方面如何? 数组是连续的内存。 链表申请内存时不需要申请连续内存。 内存分配导致链表的物理地址不连续。 那么,用next指针连接到一个链上按顺序查找存储在两个不连续物理内存中的链表内容就没有意义了。 就像是猜笔记的游戏。 你需要得到第一张便条,看看那张便条留给你的下一张便条的地址是哪里。 可以根据第一张便条的内容找到第二张便条。 要找到第三张便条,必须依次打开第一张便条找到第二张便条,然后根据第二张便条的提示找到第三张便条。 你不能随机找到第三个便条。 那么,搜索的效率链表效率很低,最坏的情况是末尾时间的复杂度是o(n )。

2 .添加链表、添加数组时,需要移动元素的位置。 那么,如果需要添加链表,是否需要移动元素的位置? 回答:不需要移动位置。 您只需将上一个指针指向此添加位置,以便上一个指针指向新添加的元素,而新添加的元素指向原始指针的下一个元素。 只要改变指针方向即可,无需移动要素,效率高,时间复杂度为o(1)。

原始链表:

添加元素

3 .链表的删除、链表的删除,只要将指向上述新追加的节点的指针变更为原节点即可。 时间复杂度o(1)。 如图所示,这是一个与新过程相反的过程。

链表

删除元素

总结

数组:查询效率高,添加和修改元素需要效率低下的元素,内存分配是连续内存,扩展需要重新分配内存。

链表:添加和修改是高效的,只需要修改指针的方向即可。 链表效率不高,需要从链表的开头开始依次查找。 内存分配不需要连续的内存,连续的内存消耗很少。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。