第6讲嵌入式C语言常见数据结构及算法Word格式文档下载.docx
《第6讲嵌入式C语言常见数据结构及算法Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《第6讲嵌入式C语言常见数据结构及算法Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。
1.先定义结构,再体类型定义该种类型的变量structStusi,s2;
structaccountzhang,wang;
定义结构体类型变fi的一般形式struct结构体名结构体变量名表:
Page6
3.直接定义结构体类型变S
(1)结构体变*的定义在函数的数据说明部分进行,也可以在函数的外部定义-但都必须是參照上述3种结构体变量的定义形式,类型定义在前,变量定义在后•
(2)结构体变量一经定义,在程序运行时,系统将按照结构体类型定义时的内存模式为结构体变*分配一定的存储单元•
说明:
结构体类型与结构体变量概念不同变*:
分配内存运算;
变量:
可以
结构体变呈a的各成员可分别表示为a.num、
a.name^a.sex^a.score
【例「备构体变量的初始化。
structdate
{intyear,month,day;
};
structstudent
{charnum[8hname[20Ksex;
structdatebirthday;
floatscore;
}a={"
9606011ming'
\*M\{1977,12,9},83},
b={"
96()8«
25"
/*ZhangliminTyF'
{1978,5,10},87},£
;
如果初值个数少于结构体成员个数,则将无初值对应的成员赋以0值如果初值个数多于结构体成员个数,则编译出错
【例】结构体数组的初始化。
structS
{charnuni[8],nanie[20],sex;
}stul3J={{"
96«
6()ir'
"
Liming"
/M\87.5},{••96()6»
12"
/*Zhangjiangguo'
*,*M'
79},{•*96«
6()13"
/*Wangping*7F*,9«
}};
元素的个数可以省略,根据赋初值时结构体常量的个数确定数组元素的个数
typedefstructaccountchen;
chench1,ch2;
关,但
结构体类型解决了如尸由于共事的特性.
数据类型不同的一组分量只有•新存储的
在需要节省内存储空I期*•效的工供了一种由若干个不同类型的数据项组成,轨存储空间的构造类型。
°
共用体——一种构造类型数据
共用体由若干不同类型的数据项组成,构成共用体的各个数据项称为共用体成员。
1.
共用体类型定义的一般形斗
例如:
unionutype{inti;
charch;
longI;
charc[4];
Page14
定义了一个unionutype共用体类型,共用体类型定义不分配内存空间,只是说明此类型数据的组成情况.
2.共用体变暑的定X
利用已定义的共用体类型名定义变量变量名表;
unionutypeul^u2;
按照共用体类型的组成,系统为定义的共用体变量分配内存单元《量所占内存大小等于共用体中占用内存的长.
printfC"
%d\n'
*iz<
?
of(unionUtypc*));
printfX**%d\n”,sizeofXul));
貉'
鶴就皐鹫存瞬轉卿
(2)共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原来的成员就失去作用
□1.1=24;
ul.ch='
if;
ul・f=12・45:
(3)共用体变量的地址和它的各成员的地址都是用一地址
例如;
&
111、&
iil・i、&
ul.ch、&
Ulf都是同一地址值。
(4)不能对共用体变量名赋值,不能企图引用变量名来得到一个值,也不能在定义共用体变量时对所有成员进行初始化。
在实际问题中,有些量的取值被限定在一个有限的范围内
个星期内只有七天
—年只有十二个月
嵌入式预科班只有2门课程(C、Linux)一个班最多只能有30个学生
如何为这些量定义类型?
字符型或其它类型显然不妥当
C语言提供了一种称为“枚举”的类型,在“枚举”类型的定
义中“列举出所有可能的取值”,说明该“枚举”类型的变量
取值不能超过定义的范围。
enum枚举名
•「枚举常壬
枚举常量是int型的常量,在使用int类型的任何地址都可以使用
weekis0
weektweek=SUNDAY;
pnntf("
weekis%d\n*\week);
printfC*slzeof{week_t)is%d\n*\sizeof(week_t));
O默认值
sizeof(week_t)is2如果是32位的C编译平台,则为4
没有特定指出常量值时,枚举列表中的常量被指定为整数值0、
1、2尊,依次递增
Page20
可以选择常最具有的報数值,后面的常最会被赋予后续的值enuml
CLASSl^ID■0,
CLASS匸XIAOKINGyCLASSl^XIAOTIAN,
二个班学号起纶值
CLiSS2-ID-40,
CLASS2"
XIAODONG,
,丿第三个班学号起始值
CLiSS3.ID■£
0,
CLJLSS2*XIA0SHUI,
Pag©
22
•定义^链表是一种常见的重要数据结构,它可以动态地进行存储分配,根据需要开辟内存单元,还可以方便地实现数据的增加和删除。
•结构:
链表中的每个元素都由两部分组成,即数指针域
•分类;
单链表(又分为单向链表和双向链表)
循环链表
-单向链表的每个节点中除信息域以外还有一个指针域,用来
指向其后续节点,其最后一个节点的指针域为空(NULL)
structmylink
inta;
structmylink*next;
}*Head,ptr;
IprevIa|next甘prev|a|ne—rev|a|next
NULL
structmylink*next;
structmylink*prev;
}"
Head,ptr;
Head
aInexi口prev|a|n—rev|a|next户
structmylinkstructmylink}'
*next;
pev;
-循环链表的组织结构与单链表非常相似,因此其操作与单链表也是一致的,惟一的差别仅在于在单链表中,算法判断到达链表尾的条佯是PTlWXt是否为空,而在双链表中,则是判断p-next是否等于头指针
Page26
结构、联合、枚举用结构构成链表
语言中的常用算法
经常采用的算法主要有迭代法、穷举搜索法、递推法、
种类:
贪婪法、回溯法、分治法、动态规划法等等。
另外,在算法设计时又常常采用递归技术,用递归描述算法。
在C语言中接确到的算法有用于排序的冒泡法和选择法,还有用于求n!
的递推法。
选择标准:
通常求解一个问题可能会有多种算法可供选择,选择的主要标准是算法的正确性和可靠性,简单性和易理解性。
其次是算法所需要的存储空间少和执行更快等。
/冒泡排序法(从小到大)
算法
过程
2222
443③
鳴家
6
5
2
F
4
6[3⑥66
Page28
I
3
J
8
i逊
\.2
・♦・■♦
4丿
••••0
6丿
・J
13
♦・♦・*
*•
[⑧
#defineN50
main()
{inti,j,t,x[N];
for(i=0;
i<
N;
i++)
scanf&
x[i]);
N-l;
1:
1
for(j二0;
j<
N-l-i:
j++)if(x[j]>
x[j+l])严比较相邻两数,小的调到前面*/
{t=x[j]:
x[j]=xLj+l];
x[j+l]=t;
}
printf('
'
thesortednembers:
\n"
);
for(i=0:
、%5d\n"
x[i]);
Page30
以6个数:
3、7、5、6、8、0为例。
算法:
第一趟:
将第一个数依次和后面的数比较,如果后面的某数小于第一个数,则两个数交换,比较结束后,第一个数则是最小的数。
第二趟:
将第二个数依次和后面的数比较,如果后面的某数小于第二个数,则两个数交换,比较结束后,第二个数则是次小的数;
、,【选率法示例】将50个学生成P孕
Page32
/i!
=-
fl
(zi=0,l)
n■(«
-1)!
*
(刃>
1)
1、直接或者间接调用函数本身叫递归调用,递归为函数嵌套调用过程
2、经典的递归算法实例:
1)
±
ntfact(intn)i£
(n<
=
return
>
eIse
n*上act(n—1);
<
retu匕n