静态链表和动态链表的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态链表和动态链表的区别相关的知识,希望对你有一定的参考价值。

请问,静态链表和动态链表到底有什么区别呢?是初始化的时候分配空间的方式不同?还是别的什么,,静态链表是只读的?? 谢谢
请不要CTRL+C别人已经回答过的答案,谢谢。

静态链表是用数组实现的,是顺序的存储结构,在物理地址上是连续的,而且需要预先分配大小。动态链表是用申请内存函数(C是malloc,C++是new)动态申请内存的,所以在链表的长度上没有限制。动态链表因为是动态申请内存的,所以每个节点的物理地址不连续,要通过指针来顺序访问。静态链表在插入、删除时也是通过修改指针域来实现的,与动态链表没有什么分别(动态链表还需要删除内存)。。不知道我的回答是不是解决了你的问题,希望可以帮到你。 (其实用链表一般都是动态链表或者结构数组) 参考技术A

静态链表和动态链表的区别:

静态链表和动态链表是线性表链式存储结构的两种不同的表示方式。

1、静态链表是用类似于数组方法实现的,是顺序的存储结构,在物理地址上是连续的,而且需要预先分配地址空间大小。所以静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针。

2、动态链表是用内存申请函数(malloc/new)动态申请内存的,所以在链表的长度上没有限制。动态链表因为是动态申请内存的,所以每个节点的物理地址不连续,要通过指针来顺序访问。

参考技术B 静态链表就是用数组描述 需要预先分配大地址空间的链表
动态链表就是用指针描述 需要用malloc 和free 动分配地址空间的链表
参考技术C 从静态与动态上语义可以看出:静态链表内存大小是规定了的 ,动态链表可以根据类型来申请不同的内存大小追问

那除此之外还有别的不同吗?

参考技术D 链表中结点的分配和回收是由系统提供的标准函数malloc和free动态实现的,称之为动态链表。而通过定义一个较大的结构体数组来作为备用结点空间(即存储池),每个结点应至少含有两个域:data域和cursor域;

C中线性表和链表的区别

参考技术A 最近经常听到朋友面试有被问到链表的问题,自己也总结了一下,应该算是比较入门向的介绍吧

线性表(数组)

数据与元素一一对应 除了第一个和最后一个其他数据元素首位相接

顺序表

线性表中用地址连续的存储单元来存放数据元素的数据结构,结点放在地址连续的存储单元中(实现方式为数组)——

链表

①物理存储单元上非连续,非顺序的存储结构(内存之中不连续)

②数据元素之间的逻辑顺序是通过链表中的指针链接次序实现

③链表由一系列结点组成(链表中的元素称为结点),结点可以在运行时动态生成

④结点包括两个部分:1.存储数据元素的数据域

                                    2.存储下一个结点地址的指针域

(实现方式为指针)

ps1:尾结点 指针域为null,若尾结点指针指向首结点,那么构成环形链表

相对于 线性表 的优势

①链表比较方便插入和删除操作,线性表中插入一个元素,那么后面的元素地址都要往后移,删除同理。而链表只需要修改结点中的指针信息,不需要修改结点地址。

②线性表在建立时就确定的总长度 因此初始长度过大或者过小都会引起内存问题:如果内存中没办法一次性给出整个线性表所需的存储空间那么就会提示内存不足,链表可以用分散的存储空间

③链表的扩展性比线性表(数组)好,一个线性表在建立后空间大小是固定的,要扩展只能新建一个更大的,而链表可以很方便的扩展

线性表相对于链表的优势

①线性表存储空间小,因为链表要在存储单元里放一个或者两个指针(双向链表)

②线性表内容可以随机访问,因为是连续的内存单元,地址连续所以在这个区间内可以进行随机,链表存储地址

③查找速度由于存储地址原因也快于链表

双向链表

一句话 结点中有两个指针 一个指针指向直接前驱,一个指针指向直接后继

优势:查找更方便,用于大量数据的遍历

相对于单向 存储空间也更大

以上是关于静态链表和动态链表的区别的主要内容,如果未能解决你的问题,请参考以下文章

链表和数组的区别

线性表——顺序表和链表

数据结构 - 链表和数组的区别

数据结构 - 链表和数组的区别

数据结构:静态链表(C语言描述)

静态链表