c语言动态存储分配和链表,C语言静态链表和动态链表

1. 静态链表

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

struct link

{

char ch;

struct link *p;

} a;

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

7120054368b9708330006b35d02aa8d5.png

图1 引用自身的结构体

例1 一个简单的链表

#include

struct node

{

int data;

struct node *next;

};

typedef struct node NODETYPE;

int main()

{

//a是头结点,b是中间节点,c是尾节点

//h是基类型为NODETYPE的指针,指向头结点

//p是基类型为NODETYPE的指针,用于遍历链表

NODETYPE a, b, c, *h, *p;

//给变量中的data赋值

a.data = 10;

b.data = 20;

c.data = 30;

//将节点相连

h = &a;

a.next = &b;

b.next = &c;

c.next = '\0';

//移动p,使之依次指向a、b、c,输出它们data中的值

p = h;

while (p)

{

printf("%d\t", p->data);

p = p->next; //p顺序后移

}

printf("\n");

return 0;

}

STRUCT_LIST

STRUCT_LIST

以上程序中所定义的结构体类型 NODETYPE 共有两个成员:成员 data 是整型;成员 next 是指针类型,其基类型是 NODETYPE 类型。

a、b、c 是 NODETYPE 结构体类型变量,h 和 p 是指向 NODETYPE 结构体类型的指针变量。执行程序后,形成如图2所示的存储结构体:指针 h 中存放变量 a 的地址,变量 a 的成员 a.next 中存放变量 b 的地址……,最后一个变量 c 的成员 c.next 置为 '\0'(NULL)。这样就把同一类型的结构体变量 a、b、c “链接”到一起,形成所谓的“链表”,变量 a、b、c 称为链表的节点。

在此例中,链接到一起的每个节点(结构体变量 a、b、c)都是通过定义,由系统在内存中开辟了固定的、不一定连续的存储单元。在程序执行过程中,不可能人为的再产生新的存储单元,也不能认为的使已开辟的存储单元消失。这种链表成为“静态链表”。

83a5395a07fa33a3f1dbf1967f46dafa.png

图2 链表存储结构示意图

2.动态链表的概念

到目前为止,凡是遇到处理“批量”数据时,我们都是利用数组来存储。定义数组必须(显式的或隐含的)指明元素的个数,从而也就限定了一个数组中存放的数据量。在实际应用中,一个程序在每次运行时要处理的数据的数目通常并不确定。如果数组定义的小了,就没有足够的空间存放数据,定义大了又浪费存储空间。

对于这种情况,如果能在程序执行过程中,根据需要随时开辟存储空间,不需要时再随时释放,就能比较合理的使用存储空间。C 语言的动态存储分配提供了这种可能性。每次动态分配的存储单元,其地址不一定是连续的,而所需处理的批量数据往往是一个整体,各数据之间存在着接序关系。链表的每个节点中,除了要有存放数据本身的数据域外,至少还需要有一个指针域,用它来存放下一个节点元素的地址,以便通过这些指针把各节点连接起来(如图3)。由于链表每个存储单元都由动态存储分配获得,故称这样的链表为“动态链表”。

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

ecdde3a19609621f667e49a632e41897.png

图3 带有头结点的单向链表

每个链表都用一个“头指针”变量来指向链表的开始,如图3中的 head。也就是说,在 head 中存放了链表的第一个节点的地址。在这个链表中,我们设置了一个“头结点”,这个节点的数据域中不存放数据(根据需要也可以不设头结点)。链表最后一个节点的指针域不存放地址,置为 '\0'(NULL) 值,标志着链表的结束。上述链表的每个节点都只有一个指针域,每个指针域存放着下一个节点的地址。因此,这种链表只能从当前节点找到后继节点,故称为“单向链表”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go条件语句、switch和循环语句

一&#xff1a;Go条件语句 package mainimport "fmt"//go条件判断语句 func main() {var var1 int 10if var1 < 21 {fmt.Println("if 语法&#xff0c;小于")}if var1 < 20 {fmt.Println("if 语法")} else {fmt.Println("else 语法&…

c语言变量申明和定义区别,C语言中变量定义与声明的区别

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼在程序设计中&#xff0c;时时刻刻都用到变量的定义和变量的声明&#xff0c;可有些时候我们对这个概念不是很清楚&#xff0c;知道它是怎么用&#xff0c;但却不知是怎么一会事&#xff0c;下面我就简单的把他们的区别介绍如下&am…

初步认识JUnit

初步认识JUnit 目前大多数的基于Java的企业应用软件&#xff0c;肯定少不了单元测试&#xff0c;程序员通过编写单元测试来验证自己程序的有效性&#xff1b;管理者通过持续自动的执行单元测试和分析单元测试覆盖率来确保软件本身的质量。可以说单元测试和集成测试在软件开发整…

校招笔试C语言,校招c ++笔试题汇总

①链表反转单向链表的反转是一个经常被问到的一个面试题&#xff0c;也是一个非常基础的问题&#xff0c;最容易想到的方法遍历一遍链表&#xff0c;利用一个辅助指针&#xff0c;存储遍历过程中当前指针指向的下一个元素&#xff0c;然后将当前节点元素的指针反转后&#xff0…

STM32CubeMX使用方法及功能介绍

推荐 分享一个朋友的人工智能教程&#xff0c;零基础&#xff01;通俗易懂&#xff01;希望你也加入到人工智能的队伍中来&#xff01; http://www.captainbed.net/strongerhuang Ⅰ、写在前面 学习本文之前可以查看我前面的文章&#xff1a; STM32CubeMX介绍、下载与安装 主要…

君君喂大象C语言答案,2017年北师大版二年级语文上册句子专项复习题及答案

句子专项一、我会读拼音写句子。1. wǒ xiǎnɡ zhī do sh jia wai sh?n mē zha ynɡ sh?n q。_____________________________________________________________________________2.tā tiān tiān ɡēn zhe h? huā zi y qǐ , bǎ h? huā dānɡ ch?nɡ le hǎo p?…

2ab对应的c语言表达式是,编译原理 作业标准答案

《编译原理》第一次作业参考答案一、下列正则表达式定义了什么语言(用尽可能简短的自然语言描述)&#xff1f;1.b*(ab*ab*)*所有含有偶数个a的由a和b组成的字符串.2.c*a(a|c)*b(a|b|c)* | c*b(b|c)*a(a|b|c)*答案一&#xff1a;所有至少含有1个a和1个b的由a&#xff0c;b和c组成…

v4l2视频采集摄像头

v4l2 --是Linux内核中关于视频设备的内核驱动框架&#xff0c;为上层访问底层的视频设备提供了统一的接口。/dev/vidioX 1.打开设备文件 fdopen("/dev/video3"&#xff0c;O_RDWR); /dev/video3&#xff1a;视频设备文件名 O_RDWR&#xff1a;可读可写 fd: open成功反…

c 语言 16进制写法,C语言16进制中16怎么表示?

C语言16进制中16怎么表示&#xff1f;关注:275 答案:4 手机版解决时间 2021-02-16 21:21提问者童話被染上了傷2021-02-15 23:02C 中 16进制 16 是用10表示吗&#xff1f;8进制中逢8进一 也写作10&#xff1f;最佳答案二级知识专家X謝你的出現2021-02-15 23:4116进制 16 是用1…

关于JPA方法名创建自动查询

JPA 的根据解析方法名称自动对接口进行实现的方法能节省大量的资源&#xff0c;以下对于解析规则进行列举哈 商品实体类 package com.dionren.zhaoxie.entity.trade;import com.dionren.mvc.entity.EntityBase; import com.dionren.zhaoxie.entity.EntityShoeSku; import io.sw…

查到应看的网址

http://www.zhangxinxu.com/wordpress/2010/12/div-textarea-height-auto/ > div模拟textarea文本域轻松实现高度自适应 https://www.web-tinker.com/article/20054.html 一个很特殊的事件beforeunload(点击确定离开,取消继续) http://www.jb51.net/article/39486.htm ifr…

c语言程序前言,C语言 程序代码编写规范前言

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼一个好的程序编写规范是编写高质量程序的保证。清晰、规范的源程序不仅仅是方便阅读&#xff0c;更重要的是能够便于检查错误&#xff0c;提高调试效率&#xff0c;从而最终保证软件的质量和可维护性。说明l 本文档主要适用于刚刚开…

c语言去字母的其中三个,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#includemain(){int acount0,bcount0,ccount0,dcount0;char a;printf("请输入一行字符:\n");a getchar();while (a !\n){switch (a){caseq:casew:casee:caser:caset:casey:caseu:casei:caseo:casep:casea:cases:cased:c…

[CF706D]Vasiliy's Multiset(异或字典树)

题目链接&#xff1a;http://codeforces.com/contest/706/problem/D 1 /*2 ━━━━━┒ギリギリ♂ eye&#xff01;3 ┓┏┓┏┓┃キリキリ♂ mind&#xff01;4 ┛┗┛┗┛┃&#xff3c;○&#xff0f;5 ┓┏┓┏┓┃ /6 ┛┗┛┗┛┃ノ)7 ┓┏┓┏┓┃8 ┛┗┛┗┛┃9 ┓┏…

信号与系统与c语言,2016年安徽医科大学生命科学学院信号系统与C语言程序设计之信号与系统复试笔试仿真模拟题...

一、计算题1&#xff0e; 已知系统的算子方程及初始条件如下&#xff0c;求其零输入响应。【答案】(l )由算子方程可以得出其系统的传输函数为由因此代入初始条件和&#xff0c;解出&#xff1a;求得特征根为&#xff1a;所以零输入响应为(2)由算子方程可以得出其系统的传输函数…

android状态栏

郭林《Android状态栏微技巧&#xff0c;带你真正理解沉浸式模式 》转载于:https://www.cnblogs.com/hsji/p/5803527.html

android 自定义属性 双向绑定,如何解决:“在使用自定义视图实现双向数据绑定时,找不到属性’android:text’”的getter?...

我经历了许多类似的问题,但没有一个答案似乎解决了我的问题.我实现了一个自定义EditText,我希望与双向数据绑定兼容.问题是,每次我尝试编译时都会收到错误&#xff1a;Error:java.lang.IllegalStateException: Failed to analyze: android.databinding.tool.util.LoggedErrorEx…

linux用grep查找包含两个关键字的命令

linux用grep查找包含两个关键字的命令 http://zhidao.baidu.com/link?urlVsFxeJXmU7W7hy1UH7eT6QAbUsVz9Ru2ABPuWYHWm4kBvE0ccLDwcvFi821FT5uWvgjJkNEgx80ICQaaR3HxMCr1BnLe8naTKZUwxseZ4qe http://www.linuxidc.com/Linux/2016-01/127944.htm ##查询历史记录 http://blog.sin…

Ext JS 6学习文档-第6章-高级组件

Ext JS 6学习文档-第6章-高级组件 高级组件 本章涵盖了高级组件&#xff0c;比如 tree 和 data view。它将为读者呈现一个示例项目为 图片浏览器&#xff0c;它使用 tree 和 data view 组件。以下是本章将要讨论的主题&#xff1a; TreesData views拖放图片浏览器 — 一个示例项…

android没有apk文件怎么打开方式,ios怎么打开apk文件,安卓无法打开apk文件

?  许多win7系统小伙伴在打开电脑中&#xff0c;经常会看到一些文件格式自己不知道是什么以及不知道要怎么打开&#xff0c;比如apk文件&#xff0c;APK是Android Package的缩写&#xff0c;即Android安装包&#xff0c;几乎所有的安卓应用程序都是这种格式&#xff0c;那么…