链表和位段
操作系统-第4章习题解析

操作系统-第4章习题解析第4章习题解析1.为什么要配置层次式存储器?答:这是因为: a.设置多个存储器可以使存储器两端的硬件能并⾏⼯作。
b.采⽤多级存储系统,特别是Cache技术,这是⼀种减轻存储器带宽对系统性能影响的最佳结构⽅案。
c.在微处理机内部设置各种缓冲存储器,以减轻对存储器存取的压⼒。
增加CPU中寄存器的数量,也可⼤⼤缓解对存储器的压⼒。
2.可采⽤哪⼏种⽅式将程序装⼊内存?它们分别适⽤于何种场合?答:将程序装⼊内存可采⽤的⽅式有:绝对装⼊⽅式、重定位装⼊⽅式、动态运⾏时装⼊⽅式;绝对装⼊⽅式适⽤于单道程序环境中,重定位装⼊⽅式和动态运⾏时装⼊⽅式适⽤于多道程序环境中。
3.何为静态链接?静态链接时需要解决两个什么问题?答:静态链接是指在程序运⾏之前,先将各⾃⽬标模块及它们所需的库函数,链接成⼀个完整的装⼊模块,以后不再拆开的链接⽅式。
将⼏个⽬标链接装配成⼀个装⼊模块时,需解决以下两个问题: 将相对地址进⾏修改。
即将除第⼀个模块外的相对地址修改成装⼊模块中的相应的相对地址。
变换外部调⽤符号。
即将每个模块中所⽤的外部调⽤符号,都变换为相对地址。
4.何谓装⼊时动态链接?装⼊时动态链接⽅式有何优点?答:装⼊时动态链接是指将⽤户源程序编译后所得到的⼀组⽬标模块,在装⼊内存时,采⽤边装⼊边链接的⼀种链接⽅式,即在装⼊⼀个⽬标模块时,若发⽣⼀个外部模块调⽤事件,将引起装⼊程序去找相应的外部⽬标模块,把它装⼊内存中,并修改⽬标模块中的相对地址。
装⼊时动态链接⽅式有以下优点: 1)便于修改和更新 2)便于实现对⽬标模块的共享5.何谓运⾏时动态链接?运⾏时动态链接⽅式有何优点?答:运⾏时动态链接是将对某些模块的链接推迟到程序执⾏时才进⾏链接,也就是,在执⾏过程中,当发现⼀个被调⽤模块尚未装⼊内存时,⽴即由0S去找到该模块并将之装⼊内存,把它链接到调⽤者模块上。
优点:凡是在执⾏过程中未被⽤过的⽬标模块,都不会被调⼊内存和被链接到装⼊模块上,这样不仅能加快程序的装⼊过程,⽽且可节省⼤量的内存空间。
数据结构的顺序存储

数据结构的顺序存储
数据结构是计算机科学中的重要概念,它是指一组数据元素以及在这
些数据元素之间的关系。
在计算机程序中,数据结构的存储方式有很
多种,其中顺序存储是一种常见的方式。
顺序存储是指将数据元素存储在一段连续的存储空间中,每个数据元
素占用一个存储单元,数据元素之间的关系通过它们在存储空间中的
相对位置来表示。
顺序存储的优点是存取速度快,适合于对数据的随
机访问,但是它的缺点是插入和删除操作比较困难,需要移动大量的
数据元素。
在顺序存储中,数据元素的存储位置可以通过下标来访问,这种访问
方式非常快速和高效。
例如,在一个数组中,我们可以通过下标来访
问数组中的任何一个元素,这种访问方式的时间复杂度为O(1)。
顺序存储适用于那些需要频繁访问数据元素的场景,例如在图形处理、数据库管理、科学计算等领域中。
在这些领域中,数据元素的数量通
常很大,因此需要使用高效的存储方式来提高程序的性能。
顺序存储的实现方式有很多种,其中最常见的是使用数组来实现。
在
使用数组实现顺序存储时,需要预先分配一段连续的存储空间来存储
数据元素,然后通过下标来访问这些数据元素。
除了数组之外,顺序存储还可以使用链表、栈、队列等数据结构来实现。
例如,在链表中,每个节点存储一个数据元素,通过节点之间的指针来表示它们之间的关系。
在栈和队列中,数据元素按照一定的顺序存储,可以通过栈顶或队首来访问它们。
总之,顺序存储是一种高效的数据存储方式,适用于那些需要频繁访问数据元素的场景。
在实际应用中,我们可以根据具体的需求选择不同的实现方式来实现顺序存储。
《C程序设计》课程标准

《C程序设计》课程标准一、课程说明:1.本课程的性质:C程序设计是近年来在国内外得到迅速推广应用的一种现代程序设计语言,它以丰富灵活的控制和数据结构,简洁而高效的语句表达、良好的移植性,已被广泛的应用于系统软件和应用软件的开发中。
2.本课程教学目的及任务:教学目的:通过学习C程序设计课程,使学生掌握 C语言的基本内容及程序设计的算法思想与编程技巧,了解进行科学计算的一般思路,培养学生应用计算机解决和处理实际问题的思维方法与基本能力,为以后学习数据结构、操作系统等后继课程创造必备的条件,并为今后从事软件开发打下良好基础。
教学任务:通过理论学习和编程训练,使学生了解C语言特点,理解C语言的基本概念,掌握C语言的语法规则和结构化程序设计的特点、方法及开发工具的使用,激发学生底层编程方向的兴趣,培养学生的编程能力。
3.本课程教学与其他课程的关系:先修课程:《计算机文化基础》后继课程:《数据结构》、《操作系统》、《数据库原理及应用》4.教学时数分配:总学时72,理论52,实验20。
教学时数分配表5.建议教材与参考书谭浩强·《C程序设计》(第三版)·清华大学出版社谭浩强·《C语言程序设计》(第二版)·清华大学出版社·2008主要参考书:谭浩强·《C程序设计》(第三版)·清华大学出版社谭浩强·《C语言程序设计》(第二版)·清华大学出版社谭浩强·《C程序设计题解与上机指导》(第三版)清华大学出版社谭浩强·《C程序设计教程实习指导与模拟试题》6.考核模式:考试二、课程内容:第一章 C语言概述【教学要求】:熟悉TURBO C2.0/VisualC++6.0集成环境的使用了解用计算机解决实际问题的基本步骤掌握C程序的构成和C程序的运行过程。
【本章重点】:C程序的构成和C程序的运行过程【本章难点】:用计算机解决实际问题的基本步骤【教学内容】:第一节:C语言出现的历史背景第二节:C语言的特点第三节:简单的C程序介绍第四节:C程序的上机步骤和方法【参考书目】:谭浩强·《C语言程序设计》(第二版)·清华大学出版社第二章数据类型、运算符与表达式【教学要求】:掌握C语言中的各种数据类型及变量的定义方法。
严蔚敏版数据结构习题及参考答案

习题1一、单项选择题A1.数据结构是指()。
A.数据元素的组织形式B.数据类型C.数据存储结构D.数据定义C2.数据在计算机存储器内表示时,物理地址与逻辑地址不相同的,称之为()。
A.存储结构B.逻辑结构C.链式存储结构D.顺序存储结构D3.树形结构是数据元素之间存在一种()。
A.一对一关系B.多对多关系C.多对一关系D.一对多关系B4.设语句x++的时间是单位时间,则以下语句的时间复杂度为()。
for(i=1; i<=n; i++)for(j=i; j<=n; j++)x++;A.O(1)B.O(2n)C.O(n)D.O(3n)CA5.算法分析的目的是(1),算法分析的两个主要方面是(2)。
(1) A.找出数据结构的合理性 B.研究算法中的输入和输出关系C.分析算法的效率以求改进D.分析算法的易懂性和文档性(2) A.空间复杂度和时间复杂度 B.正确性和简明性C.可读性和文档性D.数据复杂性和程序复杂性6.计算机算法指的是(1),它具备输入,输出和(2)等五个特性。
(1) A.计算方法 B.排序方法C.解决问题的有限运算序列D.调度方法(2) A.可行性,可移植性和可扩充性 B.可行性,确定性和有穷性C.确定性,有穷性和稳定性D.易读性,稳定性和安全性7.数据在计算机内有链式和顺序两种存储方式,在存储空间使用的灵活性上,链式存储比顺序存储要()。
A.低B.高C.相同D.不好说8.数据结构作为一门独立的课程出现是在()年。
A.1946B.1953C.1964D.19689.数据结构只是研究数据的逻辑结构和物理结构,这种观点()。
A.正确B.错误C.前半句对,后半句错D.前半句错,后半句对10.计算机内部数据处理的基本单位是()。
A.数据B.数据元素C.数据项D.数据库二、填空题1.数据结构按逻辑结构可分为两大类,分别是______________和_________________。
C语言程序设计教程CJ_07结构体类型概述_潭浩强第3版

例:
27
辽宁师范大学
蔡静
用于动态存储分配的函数(续)
stdlib.h
Free 函数 Void *free( void *ptr ){ …… }
功能:将ptr指向的内存空间释放,交还给系统,无返 回值。 说明:ptr值不能是任意地址,只能是由于在程序中最 近一次调用过的malloc或calloc函数所返回的地址。 例: p=(char *)malloc(80);
17
辽宁师范大学
蔡静
11.6
11.6.1
指向结构体的指针
指向结构体变量的指针
指针变量的值为结构体变量的起始地址。 说明:
结构体变量.成员名 (*结构体指针).成员名 结构体指针->成员名 三者等价 ->优先于++。 p->num++ 即 (p->num)++ ++p->num 即 ++(p->num)
7
struct stud { long num; char name[20]; struct date { int month; int day; int year; }birth; char sex; }; struct stud s1, st[50];
辽宁师范大学 蔡静
11.2 结构体类型变量的定义和引用 1. 结构体变量的定义
数据类型概述
整型 基本 数据类型 Short int long float double
系统预定义的标准数据类型
实型(浮点型) 字符类型char Void类型
指针类型T* 结构体类型struct 位段 bit field 共用体类型union 枚举类型enum typedef 数组类型T[……] 文件类型FILE 函数类型
长短链地点和停车提示卡

长短链区段行车安全措施一、列车被迫停于区间长短链地段需请求救援时,司机应按照附件1的长短链计算方法,准确计算出停车公里标位置后立即向就近车站值班员或列车调度员汇报,并按规定设置防留防护。
二、担当救援时,司机接到救援命令后,必须认真确认救援命令注明的公里标,对应自己当前机车所处位置,根据上述方法对照长短链表,计算出担当救援机车当前位置距被救援车列实际距离,从而确定救援机车距被救援车列停车位置2km的准确公里标,并记录于司机手帐和调度命令上,命令不清、停车位置不明时,不准动车。
当救援机车接近被救援车列2km时必须严格控制速度,彻底瞭望,加强联控,运行速度最高不得超过20km/h,在防护人员处或压上响墩后停车,联系确认后,按要求进行救援作业。
三、遇区间有临时慢行时,机车乘务员(轨道车司机)应依照地面实际慢行标志提前控制速度,在慢行起始、终止标处进行定标确认,严格按照慢行限速条件运行。
四、区间救援时监控操作方法:1.在自闭区间正方向运行,按LKJ正常控制状态操作。
2.半自闭区间或自闭区间反方向进入区间时,开车后在规定对标开车地点停车,按压【开车】键后,将LKJ转入调车状态运行。
3.半自闭区间或自闭区间救援后由区间返回时,将LKJ转入调车状态运行。
4.担当救援任务的二位及以后机车、被救援机车均将监控装置转入补机位运行。
救援走行距离简易计算方法一、LKJ以正常运行模式运行时,控速地点公里标为:1、顺公里标运行时:救援地点公里标-2000m+长链长度-短链长度。
2、逆公里标运行时:救援地点公里标+2000m-长链长度+短链长度。
二、LKJ以调车状态运行时,走行距离为:开车地点公里标与救援地点公里标的差值+长链长度-短链长度。
包西线省界—张桥间上下行断链表1-1。
C语言程序设计实习报告
C语言程序设计实习报告一、实习目的1. 巩固和加深对C语言程序设计的理解。
2. 掌握C语言编程的基本技巧和方法。
3. 提高分析问题、解决问题的能力。
4. 学会将理论知识应用于实际编程中。
二、实习内容XXX语言基础语法练习变量、数据类型、运算符、表达式等基础语法练习。
控制结构(顺序、分支、循环)的实现。
函数的定义和调用方式练习。
2. 模块化程序设计将一个大的程序分解成多个模块,每个模块完成特定的功能。
通过模块间的调用和传递数据来实现整个程序的功能。
3. 文件操作与文件读写文件的打开、关闭、读写操作练习。
文件格式的转换和数据统计处理。
4. 预处理指令与宏定义使用预处理指令进行条件编译和宏定义替换。
练习使用常见的预处理指令如include、define、ifdef等。
5. 结构体、链表与指针结构体的定义和使用。
链表的创建、插入、删除、遍历等操作。
指针的概念和指针运算。
深入理解指针与数组、结构体等数据结构的关系。
6. 位运算与嵌入式系统编程学习位运算符的使用和位段操作的实现。
嵌入式系统的基本概念和编程方法。
7. 综合项目实践参与或独立完成一个综合性C语言程序设计项目。
项目可以包括基于命令行参数的程序设计、基于文件操作的程序设计、基于网络编程的程序设计等。
三、实习过程1. 理论学习:通过教材、网络资源等途径学习C语言的基础知识和编程技巧。
2. 上机实践:在计算机上编写和调试C语言程序,不断巩固所学知识。
3. 问题解决:遇到问题时,通过查阅资料、请教老师或同学等方式解决问题。
4. 团队合作:在小组项目中与他人协作,共同完成任务。
四、实习收获1. 知识技能方面:深入理解了C语言的基本概念和编程技巧,掌握了模块化程序设计和文件操作等常用算法。
2. 解决问题能力方面:学会了如何分析问题、寻找解决方案并通过实践验证解决方案的正确性。
3. 团队协作能力方面:学会了与他人合作,共同完成任务,提高了团队协作能力。
4. 职业素养方面:培养了耐心、细致的工作态度和勇于尝试、敢于创新的探索精神。
数据结构的四种存储结构
数据结构的存储结构通常可以分为以下四种类型:1. 顺序存储结构(Sequential Storage Structure):顺序存储结构是将数据元素存储在一块连续的存储空间中。
每个元素占据一段连续的内存空间,并且相邻元素之间在内存中也是相邻的。
数组就是一种典型的顺序存储结构,可以通过下标来直接访问元素。
顺序存储结构的特点是随机访问速度快,但插入和删除操作需要移动大量元素。
2. 链式存储结构(Linked Storage Structure):链式存储结构通过节点之间的指针连接来存储数据元素。
每个节点包含数据和指向下一个节点的指针,最后一个节点的指针为空。
链式存储结构的特点是插入和删除操作方便快捷,不需要移动元素,但访问元素需要遍历链表。
3. 索引存储结构(Indexed Storage Structure):索引存储结构使用一个索引表来存储数据元素的地址或者指针。
索引表中的每个条目包含一个关键字和对应数据元素的地址或指针。
通过索引表可以快速定位和访问数据元素,而无需遍历整个数据集。
索引存储结构适用于静态数据集或者数据集更新较少的情况。
4. 散列存储结构(Hashed Storage Structure):散列存储结构使用散列函数将数据元素的关键字映射为存储位置。
存储位置可以是数组或者其他数据结构,称为散列表。
通过散列函数,可以直接计算出数据元素的存储位置,从而实现快速的插入、查找和删除操作。
散列存储结构适用于需要快速查找和访问数据的情况,但可能存在散列冲突的问题,需要解决冲突并保证散列函数的均匀性。
这些存储结构可以根据具体的应用场景和需求选择使用,每种结构都有其适用的优势和限制。
C语言各章节单元测试题及答案——结构体与共用体
第9章结构体与共用体9.1典型考试题剖析9.1.1选择题【例1】若指针p已经正确定义,要使p指向两个连续的整型动态存储单元,不正确的语句是。
A) p=2*(int *)malloc(sizeof(int)); B) p=(int*)malloc(2*sizeof(int));C) p=(int *)malloc(2*2); D) p=(int*)calloc(2,sizeof(int));✧考点:动态存储分配函数。
✧分析:根据动态存储分配函数malloc和calloc的函数原型可以知道,calloc函数的调用形式为:void * calloc(unsigned n,unsigned size);表示在动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配域起始地址的指针,因此答案D是正确的。
malloc函数的调用形式为:void * malloc(unsigned int size);表示是在内存的动态存储区分配一个长度为size的连续空间,并返回一个指向分配域起始地址的指针,答案B和C中malloc的参数分别为:2*(sizeof(int))和2*2,都是整型数,因此调用形式正确。
答案A中(int *)malloc(sizeof(int))的返回值为一个地址值,将地址的值乘以2是没有意义的。
✧答案:A【例2】若有以下说明和定义:struct test{ int m1; char m2; float m3;union uu{ char u1[5]; int u2[2]; }ua;}myaa;则sizeof(struct test)的值是。
A) 12 B) 16 C) 14 D) 9✧考点:结构体类型和共用体类型所占内存的字节数。
✧分析:sizeof(struct test)的功能是求结构体类型test所占用的内存字节数。
它应该等于结构体每个成员所占的字节数之和。
m1为int型,占2字节,m2为char型,占1字节,m3为float型,占4字节,接下来是一个共用体类型uu,共用体所占的字节数应该等于成员中最长者所占的字节数,u1占5字节,u2占4字节,那么该共用体类型应该占用5字节,所以2+1+4+5=12。
块状链表
在数据结构的世界里,我们会认识各种各样的数据结构,每一种数据结构都能解决相应领域的问题,每一种数据结构都像是降龙十八掌中的某一掌,掌掌毙命。
当然每个数据结构,有他的优点,必然就有它的缺点,那么如何创造一种数据结构来将某两种数据结构进行扬长避短,那就非常完美了。
这样的数据结构也有很多,比如:双端队列,还有就是今天讲的块状链表,我们都知道数组具有O(1)的查询时间,O(N)的删除,O(N)的插入。
链表具有O(N)的查询时间,O(1)的删除,O(1)的插入。
那么现在我们就有想法了,何不让“链表”和“数组”结合起来,来一起均摊CURD的时间,做法将数组进行分块,然后用指针相连接,比如我有N=100个元素,那么最理想情况下,我就可以将数组分成x=10段,每段b=10个元素(排好序),那么我可以用√N的时间找到段,因为段中的元素是已经排好序的,所以可以用lg√N的时间找到段中的元素,那么最理想的复杂度为√N+lg√N≈√N。
下面我们看看怎么具体使用:一:结构定义这个比较简单,我们在每个链表节点中定义一个头指针,尾指针和一个数组节点。
1publicclass BlockLinkNode2{3///<summary>4///指向前一个节点的指针5///</summary>6public BlockLinkNodeprev;78///<summary>9///指向后一个节点的指针10///</summary>11public BlockLinkNode next;1213///<summary>14///链表中的数组15///</summary>16public List<int> list;17}二:插入刚才也说了,每个链表节点的数据是一个数组块,那么问题来了,我们是根据什么将数组切开呢?总不能将所有的数据都放在一个链表的节点吧,那就退化成数组了,在理想的情况下,为了保持√N的数组个数,所以我们定了一个界限2√N,当链表中的节点数组的个数超过2√N的时候,当下次插入数据的时候,我们有两种做法:①在元素的数组插入处,将当前数组切开,插入元素处之前为一个链表节点,插入元素后为一个链表节点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
定义 在定义结构体类型时,可包括指针 域,当指针域基类型就是结构体本 身(包括一个指向结构体本身类型的 指针域),则称递归结构体。 举例 struct student { int num; char name[20], sex; struct student *link; }; 链表的每一个节点都是递归结构体。
动态数据结构
问题的提出 链表的定义 链表的特点及操作原理 动态链表的建立 链表的删除操作 *链表的插入操作 *程序举例1、2
• 下面的结构什么意思?
struct temp { int data; struct temp pt; };
•
•
在结构体类型的定 义中,如果包含了 本结构体类型的成 TC下的错误提示: 员,那么由于在本 结构体类型尚未定 – Undefined structure 义结束时,本结构 ‘temp’ 体类型所占的内存 – Structure size too large 字 节 数 尚 无 法 确 定 ,因此系统将无法 VC下的错误提示: 为这样的结构体类 – ‘pt’ uses undefined 型分配内存。
位段结构的说明
⒍一个位段必须存储在一个存储单元 (字)中,不能跨两个单元。如果第一个 单元空间容纳不下一个位段,则该空 间不用,而从下一个单元开始存放该位 段。
位段结构的说明
⒎可以定义无名位段。例如: unsigned a : 2; unsigned : 2; (该两位空间不用) unsigned b : 3; unsigned c : 1;
解 法 1
#define null 0 struct student {long num; float score; struct student *next;}; main( ) {struct student *head, *p; p=head=(struct student *)malloc(sizeof(struct student)); for(i=1; i<=3; i++) {(*p).next= (struct student *)malloc(sizeof(student)); p=p->next; p ->next=null; scanf("%ld, %f", &(p->num), &(p->score));} while (p!=null) {printf(%ld %5.1f\n, p->num,p->score); p=p->next;} }
递归结构体可以构成链表动态结构,
递归结构体
链表的特点及操作原理
1.在链表中易于插入一个新节点。
head
各域值
╳
各域值
各域值
各域值 null
链表的特点及操作原理
2.在链表中易于删除一个节点。
head 各域值
╳
各域值
各域值 null
struct Link *DelNode(struct Link *head, int nodeData) { struct Link *p=head,*pr=head; if(head==NULL)/*链表为空,没有节点,无法删除节点*/ { printf("no linked table!\n"); return(head); } /*若没找到节点nodeData且未到表尾,则继续找*/ while(nodeData!=p->data &&p->next!=NULL) { pr=p; p=p->next; } if(nodeData==p->data)/*若找到节点nodeData,则删除该节点*/ { if(p==head)/*若待删除节点为首节点,则让head指向第2个节点*/ { head=p->next; } else/*若待删除节点不是首节点,则将前一节点的指针指向当前节点的下一节点*/ { pr->next=p->next; } free(p);
head ╳
各域值 各域值 null
p
各域值
链表的后端插入 p
head
各域值 各域值 null
各域值 null
链表的中间插入
head
各域值 各域值 null
p
各域值
动态链表程序举例----1
建立一个如下图的简单链表,它由三个 学生数据的结点组成,并输出各结点的数 据。
99101 89.5 99103 90 99107 85 ∧
} else { printf("this node has not been founde!\n"); } return head; }
在链表中删除一个节点。P340
链表的特点及操作原理
3.在链表中不易于检索一个节点。
4.在链表中易于出现断链。
动态链表的建立
举例
lp
各域值
struct student{ char name[20]; long num; struct student *link; }*rp, *lp, *p; rp
链表的删除操作
lp
head 各域值
lp
各域值 各域值 null
rp
p=lp; lp=lp->link;
free(p);
系统
注明 删除节点就是将该节点从链表中分离出来。删除
后,一定将该节点归还给系统,以便于再分配; 否则,链表将永久丢失。
分类 前端删除
后端删除
中间删除
链表的删除操作——前端删除
lp
各域值 null
p
rp
各域值 null
p=(struct student *)malloc(sizeof(struct student) strcpy(p->name, "zhang san"); p->num=9901012; p->link=null; rp->link=p; rp=p;
#include <stdio.h> #include <conio.h> #include <stdlib.h> struct link {int data; struct link *next; }; main( ) {int i=0, j; struct link *head, *pr, *p; char c; head=NULL; printf("\nPlease press 'i' to insert one new node."); while(1) {c = getchar( ); if(c!='i' && c!='q')continue; if(c=='q') break; p=(struct link *)malloc(sizeof(struct link)); if(p==NULL){printf("No enough memory to alloc."); exit(0);} p->next = NULL; p->data = i*10; if(i==0){head = p; pr = p;} else {pr->next = p; pr = p;} i++; printf("\nCreate a new node!"); printf("\nPlease press 'i' to insert one new node."); } p=head; for(j=0; j<i; j++){printf("\n%5d%10d\n", j, p->data); p=p->next;} }
解 法 2
位段结构
为什么使用位段结构 位段结构的定义
位段结构的说明
为什么使用位段结构
当数据的值很小时,以存储单元为单位 大量浪费存储空间。 例如:逻辑量真假值0,1以整形存储, 在两个字节中只使用了一个二进制位。 解决办法:用一个二进制位存储0和1。
位字段
• 想表达人的姓名、出生年、月、日,都定 义什么类型的成员变量? • struct person { char name[12]; int year; char month; char day; }; • 这样有很多的空间浪费,比如month只可 能取值1-12,4bits足够
name[12]; year : 12; month : 4; day : 5;
• 调整成员顺序可以让结构更紧凑 • 每个位段都可以当作一个无符号整型数使 用
– 表达范围当然受限,而且当然不能取地址
位段结构的说明
⒈在存储单元中位段的空间分配方向, 因机器而异。
⒉位段中的数据引用与结构体的引用相 同。 结构体名.成员
这是链表数据结构的编程基础。
• 链表(Linked table)
struct Link { int data; struct Link *next; }
head
data
next
data
next
data
next
data
NULL
图8-9 链表原理图
为什么使用动态数据
使用静态数据结构,当数据较少时, 浪费大量空间。 动态数据使用的是链表结构,当有一 个数据时,就申请一个结点,链到链表 中去。 …… 各域值 null 各域值 null 各域值 null
位段结构的说明
⒊给位段数据赋值时,应注意其最大、 最小存储值。 union packed_data{ unsigned a: 2; /*0~3*/ unsigned b: 3; /*0~7*/ unsigned c: 4; /*0~15*/ };
位段结构的说明