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

静态链表和动态链表的区别静态链表和动态链表的区别 静态链表和动态链表是线性表链式存储结构的两种不同的表示方式 1 静态链表是用类似于数组方法实现的 是顺序的存储结构 在物理地址上是连续的 而且需要预先分配地址空间大小 所以静态链表的初始长度一般是固定的 在做插入和删除操作时不需要移动元素 仅需修改指针 2 动态链表是用内存申请函数 malloc new 动态申请内存的 所以在链表的长度上没有限制 动态链表

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


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

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

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


一、静态链表

结构体中的成员可以是各种类型的指针变量,当一个结构体中有一个或多个成员的基类型是本结构体类型时,则称这种结构体为“引用自身的结构体”。如:


struct node {   char ch; int num;   struct node *p; }; struct node a; //声明一个结构体变量 

p是一个可以指向struct node类型变量的指针成员。因此,a.p = &a 是合法的表达式,由此构成的存储结构如下图所示:

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

/* Copyright (C) 2017-2018 All rights reserved. File name : static_link.c Version : v1.0 Author : Zhengqijun Date : 2017年10月10日 星期二 15时12分30秒 Description : Funcion List : */ #include       /* 静态链表 */ struct node { int num; struct node *next; }; int main() { struct node stu[3]; struct node *head, *p; stu[0].num = 10; //对结点的num成员赋值 stu[1].num = 20; stu[2].num = 30; head = &stu[0]; //头指针指向第1个结点stu[0] stu[0].next = &stu[1]; //将结点stu[1]的地址赋值给stu[0]结点的next成员 stu[1].next = &stu[2]; //将结点stu[2]的地址赋值给stu[1]结点的next成员 stu[2].next = NULL; //stu[2]是最后一个结点,其next成员不存放任何结点的地址,置为NULL //遍历静态链表 p = head; //使p指针也指向第1个结点 do{ printf("%d\n", p->num); //输出p所指向结点的数据 p = p->next; //然后让p指向下一个结点 } while (p != NULL); //直到p的next成员为NULL,即完成遍历 return 0; }   

输出结果为:

root@ubuntu:~/2017/1010$ ./static_link 10 20 30 

二、动态链表

到目前为止,凡是遇到处理“批量”数据时,我们都是利用数组来存储。定义数组必须(显式的或隐含的)指明元素的个数,从而也就限定了一个数组中存放的数据量。在实际应用中,一个程序在每次运行时要处理的数据的数目通常并不确定。如果数组定义的小了,就没有足够的空间存放数据,定义大了又浪费存储空间。
对于这种情况,如果能在程序执行过程中,根据需要随时开辟存储空间,不需要时再随时释放,就能比较合理的使用存储空间。C 语言的动态存储分配提供了这种可能性。每次动态分配的存储单元,其地址不一定是连续的,而所需处理的批量数据往往是一个整体,各数据之间存在着接序关系。链表的每个节点中,除了要有存放数据本身的数据域外,至少还需要有一个指针域,用它来存放下一个节点元素的地址,以便通过这些指针把各节点连接起来。由于链表每个存储单元都由动态存储分配获得,故称这样的链表为“动态链表”。

参考程序如下所示:

/* Copyright (C) 2017-2018 All rights reserved. File name : dynamic_link.c Version : v1.0 Author : Zhengqijun Date : 2017年10月10日 星期二 15时31分59秒 Description : Funcion List : */ #include 
   
     #include 
    
      /*所谓动态链表,是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。*/ struct Student { int No; //学号 struct Student *next; }; int main() { struct Student *p1, *p2; struct Student *head, *p; int n = 0; //结点个数 head = NULL; p1 = (struct Student *)malloc(sizeof(struct Student)); printf("请输入第1个学号\n"); scanf("%d", &p1->No); p2 = p1; //开始时,p1和p2均指向第1个结点 while (p1->No != 0) { n++; if (n == 1) { head = p1; } else { p2->next = p1; } p2 = p1;//p2是最后一个结点 printf("请输入学号,输入0终止:\n"); p1 = (struct Student *)malloc(sizeof(struct Student)); scanf("%d", &p1->No); }; p2->next = NULL;//输入完毕后,p2->next为NULL //遍历动态链表 p = head; printf("\n学号为:\n"); while (p != NULL) { printf("%d\n", p->No); p = p->next; } return 0; } 
     
   

输出结果为:

root@ubuntu:~/2017/1010$ ./dynamic_link 

请输入第1个学号1请输入学号,输入0终止:2请输入学号,输入0终止:3请输入学号,输入0终止:4请输入学号,输入0终止:0学号为:1234



注意:动态链表中,每个节点没有自己的名字,只能靠指针维系节点之间的关系。一旦某个节点的指针“断开”,后续节点就再也无法找寻!



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/213751.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午5:44
下一篇 2026年3月18日 下午5:44


相关推荐

  • 算法题做到崩溃?刷了几千道算法题,关于如何刷题有些话我想对你说

    算法题做到崩溃?刷了几千道算法题,关于如何刷题有些话我想对你说算法刷到最后 最后记在脑子里的不是代码 是思路 如果你有思路 那你一定能把代码写出来 你不可能记住所有题的代码 唯一可以记住的是解题思路 所以怎么码代码不是一个问题 怎么解题才是一个问题 建议刷题的时候这样刷 看到一道题 先想想怎么解 如果是你的话你会用什么方法去解 想好了以后用代码实现一遍 看能不能行 一般把想法用代码实现后 你的代码跑不通 以上的原因不是你的编程问题 而是你的思路在某个点

    2026年2月23日
    2
  • 向量点乘与叉乘

    向量点乘与叉乘向量点乘与叉乘向量 Vector nbsp nbsp nbsp nbsp nbsp 在几乎所有的几何问题中 向量 有时也称矢量 是一个基本点 向量的定义包含方向和一个数 长度 在二维空间中 一个向量可以用一对 x 和 y 来表示 例如由点 1 3 到 5 1 的向量可以用 4 2 来表示 这里大家要特别注意 我这样说并不代表向量定义了起点和终点 向量仅仅定义方向和长度 向量加法 nbsp nbsp nbsp nbsp nbsp 向量也支持各种数学运算 最简单的就是加法

    2026年3月20日
    3
  • setInterval的弊端和解决方案

    setInterval的弊端和解决方案在需要重复发送请求或者某些效果的时候 一般都会想到使用 setInterval 但是它的一些弊端 会给程序带来很大的隐患一 弊端 1 setInterval 对自己调用的代码是否报错漠不关心 即使调用的代码报错了 它依然会持续的调用下去 2 setInterval 无视网络延迟 在使用 ajax 轮询服务器是否有新数据时 必定会有一些人会使用 setInterval 然而无论网络状况如何 它都会去一遍

    2026年3月19日
    2
  • 数据挖掘的方法有哪些?

    数据挖掘的方法有哪些?数据挖掘的方法有哪些?01数据挖掘方法分类介绍1.预测性——有监督学习2.描述性——无监督学习02数据挖掘方法论1.CRISP-DM方法论2.SEMMA方法论03数据挖掘建模框架的3个原则1.以成本-收益分析为单一分析框架2.以分析主体和客体为视角3.构建全模型生命周期工作模板数据挖掘是一个多学科交叉的产物,涉及统计学、数据库、机器学习、人工智能及模式识别等多种学科,如图1-4所示。01数据挖掘方法分类介绍数据挖掘方法按照来源进行分类显得过于庞杂,而且不便于理解和记忆。按照其目

    2022年6月28日
    22
  • 23天月活破3000万!阿里千问打响AI应用落地战

    23天月活破3000万!阿里千问打响AI应用落地战

    2026年3月13日
    2
  • MPEG-4、MPEG-4/AVC、H.264之间的联系与区别「建议收藏」

    MPEG-4、MPEG-4/AVC、H.264之间的联系与区别「建议收藏」当你在网上下载视频时,经常会看到MPEG-4、h.264等等词汇,它们之间有什么关系吗?  在视频编解码技术定义方面有两大标准机构。一个是国际电信联盟(ITU)致力于电信应用,已经开发了用于低比特率视频电话的H.26x标准,其中包括H.261、H.262、H.263与 H.264;另一个是国际标准化组织(ISO)主要针对消费类应用,已经针对运动图像压缩定义了MPEG

    2026年1月26日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号