嵌入式C语言编程——常见数据结构及算法
GDAIB
Data Structure and Arithmetic
结构、联合、枚举\r用结构构成链表\r单向链表\r双向链表\r循环双向链表\rC语言中的常用算法
目 录
Page 2
一个学生的信息有学号、姓名、性别、年龄、住址、成绩等。\r 一本图书的信息有分类编号、书名、作者、出版社、出版日期、价格、库存量等。\r 如何描述这些类型不同的相关数据?
?
信息管理
结构体——一种构造类型数据 \r 结构体由若干不同类型的数据项组成,\r 构成结构体的各个数据项称为结构体成员。
而数组是了相同类型数据的组合
复习——结构、联合、枚举
Page 3
struct 结构体名\r { 数据类型1 成员名1;\r 数据类型2 成员名2;\r ……\r 数据类型n 成员名n;\r };
结构体类型定义
struct为关键字;\r结构体名是用户定义的类型标识。\r{ }中是组成该结构体的成员。成员的数据类型可以是C语言所允许的任何数据类型。
例如:struct stu\r { long xh; /* 学号是长整类型 */\r char xm[20];/* 姓名是字符数组类型 */\r float zf; /* 总分是浮点类型 */\r int mc; }; /* 名次是整型类型 */
Page 4
结构体类型变量的定义
有3种方法:
1.先定义结构,再体类型定义该种类型的变量
struct stu s1 , s2;\rstruct account zhang, wang;
定义结构体类型变量的一般形式\r struct 结构体名 结构体变量名表;
2.在定义结构体类型的同时定义结构体变量。
struct account\r{ long id;\r char name[20];\r struct date Date;\r float money;\r }zhang,wang;
一般形式为:
struct 结构体名\r{数据类型 成员名1;\r 数据类型 成员名2;\r ......?\r? 数据类型 成员名n;\r } 结构体变量名表;
Page 5
3.直接定义结构体类型变量
struct\r{ long id;\r char name[20];\r struct date Date;\r float money;\r }zhang, wang;
struct\r{ 数据类型 成员名1;\r 数据类型 成员名2;\r ......\r 数据类型 成员名n;\r } 结构体变量名表;
说明:
(1)结构体变量的定义在函数的数据说明部分进行,也可以在函数的外部定义。但都必须是参照上述3种结构体变量的定义形式,类型定义在前,变量定义在后。
(2)结构体变量一经定义,在程序运行时,系统将按照结构体类型定义时的内存模式为结构体变量分配一定的存储单元。
Page 6
例 struct student\r { int num;\r char name[20];\r struct date \r { int month;\r int day;\r int year;\r }birthday;\r }stu;
例 struct date\r { int month;\r int day;\r int year; };\r struct student\r { int num;\r char name[20];\r struct date birthday;\r }stu;
说明 :结构体类型与结构体变量概念不同\r类型:不分配内存; 变量:分配内存\r类型:不能赋值、存取、运算; 变量:可以
sizeof求结构体类型数据的长度:
printf(“%d”,sizeof(struct student));\rprintf(“%d”,sizeof(stu));
Page 7
结构体变量成员引用的一般形式:\r 结构体变量名.成员名
结构体变量a的各成员可分别表示为a.num、a.name、a.sex、a.score
struct date\r { int year, month, day;};\r struct student\r { char num[8], name[20], sex;\r struct date birthday;\r float score;\r }a;
“.”是分量运算符,运算级别最高。
a.birthday.yeara.birthday.montha.birthday.day
结构体变量的各个成员可进行何种运算,由该成员的数据类型决定
结构体变量成员引用
Page 8
【例】结构体变量的初始化。\r struct date\r { int year, month, day;};\r struct student\r { char num[8], name[20], sex;\r struct date birthday;\r float score;\r }a={"9606011","Li ming",|acute;M|acute;,{1977,12,9},83},\r b={"9608025","Zhang liming",|acute;F|acute;,{1978,5,10},87},c;
如果初值个数少于结构体成员个数,则将无初值对应的成员赋以0值如果初值个数多于结构体成员个数,则编译出错
结构体变量的初始化
Page 9
【例】结构体数组的初始化。\r struct s\r { char num[8],name[20],sex;\r float score;\r }stu[3]={{"9606011","Li ming",|acute;M|acute;,87.5}, {"9606012","Zhang jiangguo",|acute;M|acute;,79},\r {"9606013","Wang ping",|acute;F|acute;,90}};
元素的个数可以省略,根据赋初值时结构体常量的个数确定数组元素的个数
结构体数组的初始化
Page 10
补充:使用typedef定义新的类型名
struct account\r{ long id;\r char name[20];\r struct date Date;\r float money;\r }zhang,wang;
struct account\r{ long id;\r char name[20];\r struct date Date;\r float money;\r }\rstruct account zhang, wang;
struct account\r{ long id;\r char name[20];\r struct date Date;\r float money;\r }\rtypedef struct account chen;
等价
注意:用typedef定义的chen是类型名,而ch1和ch2是根据这个类型而定义的两个结构体变量
chen ch1,ch2;
Page 11
结构体类型解决了如何描述一个逻辑上相关,但数据类型不同的一组分量的集合。\r 在需要节省内存储空间时,c语言还提供了一种由若干个不同类型的数据项组成,但共享同一存储空间的构造类型。
共用体——一种构造类型数据 \r 共用体由若干不同类型的数据项组成,\r 构成共用体的各个数据项称为共用体成员。
由于共享的特性,只有最新存储的数据是有效的。
共用体与共用体类型的定义
Page 12
union 共用体名\r { 数据类型1 成员名1;\r 数据类型2 成员名2;\r ……\r 数据类型n 成员名n;\r };
1、共用体类型定义的一般形式:
union为关键字;\r共用体名是用户定义的类型标识。\r{ }中是组成该共用体的成员。成员的数据类型可以是C语言所允许的任何数据类型。
Page 13
例如: \runion utype\r{ int i;\r char ch;\r long l;\r char c[4];\r };
定义了一个union utype共用体类型,共用体类型定义不分配内存\r空间,只是说明此类型数据的组成\r情况。
Page 14
2、共用体变量的定义
利用已定义的共用体类型名定义变量\r union 共用体名 变量名表;\r例如:\r union utype u1,u2;
按照共用体类型的组成,系统为定义的共用体变量分配内存单元。共用体变量所占内存大小等于共用体中占用内存的长度最长的成员。
printf(“%d\n”,sizeof(union utype));\rprintf(“%d\n”,sizeof(u1));
Page 15
(1)共用体类型变量在同一个内存段存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种
(2)共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原来的成员就失去作用
u1.i=24;\ru1.ch=’a’;\ru1.f=12.45;
(3)共用体变量的地址和它的各成员的地址都是用一地址
例如: