收藏 分享(赏)

培训班结构体要点.doc

上传人:dreamzhangning 文档编号:2309167 上传时间:2018-09-10 格式:DOC 页数:14 大小:66KB
下载 相关 举报
培训班结构体要点.doc_第1页
第1页 / 共14页
培训班结构体要点.doc_第2页
第2页 / 共14页
培训班结构体要点.doc_第3页
第3页 / 共14页
培训班结构体要点.doc_第4页
第4页 / 共14页
培训班结构体要点.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

1、1结构体与共用体要点一、概述结构体(structure )是一种数据类型,它把互相联系的数据组合成一个整体。把不同类型的数据组合成一个有机的整体,可以用结构体解决。结构体中的每一项数据,称为结构体“成员”(member)或“分量”。声明结构体类型的一般形式:struct 结构体名成员表列 ;声明各成员的形式:类型名 成员名;例如:学生数据 struct studentint num;char name20;char sex;int age;float score;char addr30;x; 注意不要忽略最后的分号student 结构体类型占 59 个字节。二、定义结构体类型变量的方法1先声明

2、结构体类型再定义变量名struct student student1, student2;要求指定为某一特定的结构体类型2在声明类型的同时定义变量struct 结构体名成员表列变量名表列;例如:struct studentint num;char name20;2char sex;int age;float score;char addr30; student1, student2;3直接定义结构体类型变量struct 成员表列变量名表列;几点说明:(1)类型与变量是不同的概念;(2)结构体中的成员可单独使用,其作用与地位相当于普通变量;(3)成员也可以是一个结构体变量;(4)成员名与普通变量

3、名相同,不代表同一对象。三、结构体变量的引用(1)不能将结构体变量整体进行输入和输出,只能对各个成员分别进行输入和输出。printf(“%d,%s,%c,%d,%f,%sn“,student1);错误(2)引用成员的方式:结构体变量名.成员名student1.num=10010;student1.birthday.month=3;(若干个成员运算符)当成员是另一个结构体变量时,应一级一级地引用成员。仅在以下两种情况下,可以把结构体变量作为一个整体来访问。(1) 结构体变量整体赋值例、student2 = student1;(2)取结构体变量地址例、printf(“%x“, /*输出 stude

4、nt1 的地址 */3四、结构体变量的初始化struct studentlong int num; /* 学号 */char name20; /* 姓名 */char sex; /* 性别 */char addr20; /* 地址 */a = 89031, “Li Lin“, M, “123 Beijing Road“; 注意:不能在结构体内赋初值。例、下面程序错误struct student long int num = 89031;char name20 = “Li Lin“;char sex = M; char addr30 = “123 Bejing Road“;a;五、结构体数组每个

5、数组元素都是一个结构体类型数据1定义结构体数组和定义结构体变量的方法相仿(三种方法)2结构体数组的初始化在定义数组的后面加上:= 初始表列 ;struct student int num;char name20;char sex;int age;4float score;char addr30;stu3 = 10101,“Li Lin“, M, 18, 87.5, “103 Bejing Road“ ,10102,“Zhang Fun“,M, 19, 99, “130 Shanghai Roaad“ ,10104,“Wang Min“, F, 20, 78.5, “1010 Zhongshan

6、 Road“ ;六、指向结构体类型数据的指针结构体变量的指针:就是该变量所占据的内存段的起始地址。1指向结构体变量的指针(*p).num 表示:p 指向的结构体变量中的成员 num成员运算符“.”优先于“*”运算符,不能写成*p.num*(p.num)三种表示形式:(1)构体变量名. 成员名(2)(*p).成员名 该方式用得很少(3)p- 成员名2指向结构体数组的指针注意:(1)p=stu;,则 p+指向 stu1(2)运算符“-”优先于 “+”运算符+p-num:使 p 所指向的 num 成员值加 1(+p)-num:先使 p+1,然后得到它指向的元素中的 num 成员值例:有 4 个学生,

7、每个学生包括学号、姓名和成绩。要求找出成绩最高者的姓名和成绩。#include “stdio.h“5void main() struct student int num; /* 学号 */char name20; /* 姓名 */float score; /* 成绩 */;struct student stu4; /* 4 个学生 */struct student *p;int i;int temp = 0; /* 成绩最高学生在数组中的序号,03 */ float max; /* 最高成绩 */for(i=0; i max)max = stui.score;temp = i; p = stu

8、 + temp; /* p 指向成绩最高的学生结构 */printf(“nThe maximum score:n“);printf(“No.: %dn name: %sn score: %4.1fn“,p-num, p-name, p-score); 3、结构体变量、指向结构体的指针均可作为函数参数6例:有一个结构体变量 stu,内含学生学号、姓名和三门课程的成绩。要求在 main 中赋以值,在函数 print 中打印输出。#include “stdio.h“#include “string.h“#define format “%dn %sn %fn %fn %fn“struct studen

9、t int num; /* 学号 */char name20; /* 姓名 */float score3; /* 三门课程的成绩 */; void print(struct student *p); /* print 函数原型声明 */void main()struct student stu;stu.num = 12345;strcpy(stu.name, “Li Li“); stu.score0 = 67.5;stu.score1 = 89;stu.score2 = 78.6; print( /*如果 stu 是结构体数组,则不要 printf(“n“); (1)结构体的成员作函数的参数。

10、7与普通变量作函数参数的用法相同。值传送,不能修改实参的值。(2)结构体指针作函数的参数。将结构体的地址传送给函数,效率高,可以修改实参的值。(3)结构体作函数的参数。将结构体的全部成员值传送给函数,效率低,不能修改实参的值。七、用指针处理链表(一定要学会画图 )1链表概述链表:动态地进行存储分配的一种结构,它动态地进行存储分配。数组:存放不同班级的学生数据,数组定得足够大,浪费内存。数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、

11、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)。链表有单向链表、双向链表、环形链表等形式。结点:链表中的每一个元素,包括两部分用户需要的实际数据下一个结点的地址 8head AB C D NULL head 指向第一个元素,第一个元素又指向第二个元素,直到最后一个元素,该元素不再指向其它元素。表尾:地址部分放一个“NULL” (表示空地址)结点应为结构体类型,一个结点中应包含一个指针变量,用它存放下一个结点的地址。例:struct studentint num;float score;struct student *next; /*next 指向 struct student 类

12、型数据*/;student 链表2简单链表所有结点都是在程序中定义的,不是临时开辟的,是 “静态链表 ”3处理动态链表所需的函数(1)malloc(size)作用:在内存的动态存储区中。函数返回值:该分配域的起始地址。不成功,则返回 NULL。(2)calloc(n,size)分配 n 个长度为 size 的连续空间(3)free(p)9释放由 p 指向的内存区。函数无返回值。4建立动态链表即从无到有,一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。例、写一函数建立一个有 3 名学生数据的单向动态链表过程:开辟单元输入数据加入链表head:头指针p1、p2:工作指针, p2 跟着

13、p1 向后走sizeof:求字节运算符(struct student *):返回的指针转换为指向 struct student 类型数据的指针。5输出链表一般从链表首部依次输出。P=p-next;6对链表的删除操作删去结点,即是把它从链表中分离出来即可。(1)删除头结点(2)删除中后结点7对链表的插入操作将一个结点按指定次序,插入到一个已有的链表中(1)头:P283 图 a、d10(2)中:P283 图 b、c(3)后:P283 图 e例:(1)下列程序用来从键盘上读入一行字符,并按输入顺序建立一个“反式”链表。即读入的第 1 个字符存入尾结点,读入的第 2 个字符存入倒数第 2 个结点,依此

14、类推,读入的最后一个字符存入头结点。读入完成后,按链表输出这一行字符,最后释放全部结点空间。例如:读入 abcd,建立的链表如下图 headd c b a 0 最后输出的一行字符为 dcba#define NULL 0#define LEN sizeof(struct node)#include “stdio.h“struct nodechar info; struct node *next; main()struct node *head,*p;char c;head= NULL ;while(c=getchar()!=n)p=( struct node *)malloc(LEN);p-in

15、fo=c;p-next=head;head= p ;11while(head!=NULL)p= head ;head= head-next 或 p-next ;putchar(p-info);free(p);/*释放一个结点*/(2)建立一条链,链中的数据按从小到大的顺序排列.#include struct node int data; struct node *next; ;struct node *addx(struct node *head,int x)struct node *p,*p1,*p2;p=(struct node *)malloc(sizeof(struct node);p

16、-data=x;if ( head=NULL )head=p;p-next=NULL;return(head);if (head-data=p-data) ( p-next=head );head=p;return (head);p1=head; p2=p1-next;if (p2=NULL)p1-next=p;p-next=NULL;return (head);while (p2-next!=NULL p2=p2-next; if (p2-datadata)p2-next=p;p-next=NULL;else( p-next=p2 );p1-next=p;return(head); main

17、()struct node *head;int i,x;head=NULL;for (i=0;idata); head=head-next; 八、共用体1共用体的概念几种不同类型的变量共占同一段内存单元(同一地址开始) 。共用体变量定义的一般形式:struct 共用体名成员表列变量表列 ;与结构体一样可以有三种定义形式。例如:union dataint i;char ch;float f;a,b,c; 注意:共用体变量所占的内存长度等于最长的成员的长度。2共用体变量的引用方式不能引用共用体变量,而只能引用共用体变量中的成员如:a.i、 a.ch、 a.f3共用体类型数据的特点每一瞬间只能存放其

18、中一种成员,起作用的是最后一次存放的成员。13例题:main()union int count2; char ch4; un;int i;char letter=6;for(i=0;i4;i+) un.chi=letter+;for(i=0;i2;i+) printf(“%d:%x, “, i, un.counti;结果:0:706,1:908九、枚举类型枚举类型 enmu:将变量的值一一列举出来,变量的值只限于列举出来的值的范围。如声明枚举类型:enum weekdaysun,mon,tue,wed,thu,fri,sat;括号中的称为枚举元素或枚举常量用它来定义变量:enum weekday workday,week_end;(类似的三种方法定义枚举变量)说明:(1)枚举元素是常量,不能被赋值(2)枚举元素是有值的 0,1,2,定义时也可以改变枚举元素的值enum weekdaysun=7,mon=1,tue,wed,thu,fri,sat 14workday,week_end;(3)枚举值可以用来做判断比较(4)一个数值不能直接赋给一个枚举变量

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报