




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、内容回顾基本类型构造类型指针类型空类型数组结构体共用体数据类型上述数据类型名不符合书写习惯怎么办?存放相同类型的数据C程序要求每个变量都要有自己的数据类型。但是自己定义类型名(标识符)一组类型不同的数据,怎么办?第10章 结构体与共用体自定义类型标识符结构体的定义与引用共用体的定义与引用10.1 自定义类型标识符 C 语言可以通过 typedef 语句,定义自己的数据类型。实际上是给 C 现有类型重新起个名字,即自定义类型标识符。typedef语句的格式:typedef 现有类型名 新类型名;C语言的类型符用户定义的类型符例如:基本类型 typedef int INTEGER; typedef
2、 float REAL;数组 typedef int ARRAY100;typedef char * POINTER;int i;float x;INTEGER i ;REAL x;就可以写成int a100,b100;char *pa,*pb;ARRAY a,b ;POINTER pa,pb;就可以写成1、先按定义变量的方法写出定义语句; 如: int a10;2、将变量名用新类型名替换; 如: int ARRAY10;3、再在最前面加typedef; 如: typedef int ARRAY10;4、然后就可以用新类型名定义变量。 如: ARRAY a,b,c; 用typedef定义新类型
3、的步骤注意: typedef 并不创建新的类型 结构体导入 一组相同类型的数据我们可以用数组来处理,但是在实际应用中,经常有一些既有联系,类型又不同的数据需要一起处理。如:学生的基本信息 字段: 学号 姓名 性别 地址 成绩类型: long char char char float C语言允许用户按自己的需要将不同的基本类型构造成一种特殊类型,即结构体。结构体的操作分为4步:根据需要先定义结构体类型;然后通过定义的类型定义结构体变量(数组、指针);结构体变量(数组、指针)赋值(址);引用结构体变量(数组、指针) 。11.2 结 构 体 定义结构体类型格式:struct 结构名 数据类型 成员1
4、 ; 数据类型 成员2 ; 数据类型 成员n ; ;结构体标志。用标识符命名的结构类型名。结构类型中所含的成员及其类型。再如定义学生结构体:struct student long num ;/*学号*/ char name20 ; /*姓名*/ char sex ; /*性别*/ int age ; /*年龄*/ float score ; /*成绩*/ ;如:日期结构体类型struct date int month; int day; int year;或:struct date int month, day, year ;此处分号不能省略;结构体的内存结构long num;char nam
5、e20 ;char sex;int age;float score;20B1B4B4B4B 为了加快cpu的存取速度,VC+编译器在处理数据时经常把结构体成员的大小按照4或8的倍数计算,此即数据对齐。基本的原则:按成员类型大小从小到大声明。 经上面定义之后:struct student 和int , float 等标准类型标识符一样可用来定义变量、数组、指针变量等如: 学生基本情况 struct student long num;char name20;char sex; int age; struct date birthday;float score; ;struct student lo
6、ng num;char name10;char sex; int age; struct date int year; int month; int day; birthday;float score; ;结构体嵌套:一个结构体成员可以又是一个结构体变量。 定义结构变量 定义结构只是确定该结构体类型的名称、成员及成员的类型。必须通过结构体类型定义变量,才能赋值并使用。结构体变量的4种定义方式:先定义结构体类型,再定义结构体变量。struct student long num ; char name20 ; int age ; char add30 ; float score ; ;struct
7、 student std1, *pst, pers3;用struct student 类型说明3个变量。定义结构类型的同时定义结构体变量。 struct student long num;char name20;char sex;int age;float score; std1, *pst, pers3;直接定义结构体变量。struct long num;char name20;char sex;int age;float score; std, *pstd, pers3;说明: 无结构体名。 注意类型和变量的区别。 成员可单独使用。如:std.age=20用typedef将结构体类型定义新
8、类型,再定义变量。typedef struct student long num;char name20;char sex;int age;float score; STREC;此处分号不能省略STREC std,*pstd, pers3 ;定义变量定义新类型1、结构体变量的初始化例如:结构体变量名=初值;注意:初值的个数、顺序、类型应与成员说明一致 结构体变量(数组、指针)的初始化结构变量(数组、指针)可以在说明时赋初值,称为初始化。格式:struct student std=20001,Li Li,M,19,85;2、结构体数组的初始化struct 结构体名 *结构体数组名 =初始数据;s
9、truct student pers3= 20001, Sun Lin, M, 19 ,85, 20002, Li Si, W, 19, 85, 20003, John, M, 19, 85 ;格式:例如:前面4种定义形式均可在定义时对结构体进行初始化。多项数据之间用逗号隔开。 结构体数组相当于一个广义的二维数组,结构体数组的初始化与二维数组的初始化类似。 3、结构体指针的初始化struct 结构体名 *结构体指针变量名=&同类结构体变量名 struct student std, *sp=&std ;格式1:例如:struct 结构体名 *结构体指针变量名=同类结构体数组名 格式2:struc
10、t student pers3,sp=pers;例如:举例:定义结构体时初始化#include stdio.hmain() struct student long num; char name20; char *sex; int age ; char addr30 ; wang = 200989001,“王五,女,20,上海 ; printf(num=%ld, name=%s, sex=%s, age=%d, addr=%s n, wang.num , , wang.sex , wang.age , wang.addr);源代码 结构体变量的引用 方式1:结构体变量名.成员
11、名方式2:(*指针变量名).成员名方式3:指针变量名-成员名1、结构体成员的引用(3种方式)若有:struct student std,pers3,*sp=&std;则 std.num=10101;等价于 sp-num=10101;std.sex=M;等价于 (*sp).sex=M;std.score=75+8;等价于 (*sp).score=75+8;std.age+;等价于 sp-age+;. 成员引用运算符-指向成员运算符(1)对于结构体类型数组,要遵循数组元素的引用原则( 或*)和结构体成员的引用原则(.或-)。引用结构体成员时的注意事项:pers2.age或(pers+2)-age或
12、(*(pers+2).2或sp-name2或(*sp).如:pers数组的第2个元素的成员age如:成员name数组的第2个元素(2)对于结构体嵌套,只能引用最低层的成员。 引用结构体成员时的注意事项:struct student long num;char name10;char sex; int age; struct date int year; int month; int day; birthday;float score; std;如:引用结构体变量std中的出生月份std.birthday.monthsp-birth
13、day.month(*sp).birthday.month注意:由外向内逐层引用,每层之间用点号“.”分隔。(3)可以对变量、数组元素及其成员进行取地址运算取结构体变量的地址为: &结构体变量名 如:&std取结构体成员的地址为: &结构体变量名.成员 如:&std.age(4)成员运算符“.”和指向运算符“-”的优先级最高,结合性自右向左。+sp-num等价于+(sp-num)sp-num+等价于(sp-num)+即成员num的值自增(+sp)-num sp指向下一个元素,再取出该元素成员num的值 (sp+)-num 先取出sp所指元素成员num的值,再指向下一个元素。(5)成员运算符的优
14、先级高于地址运算符(*sp).name 不同于*、*sp-name若有struct student std=20001,John,M,19,85,*sp=&std;则*(*sp).name)值为John 而* 错误但*sp-name值为c(6)结构体指针只能指向同类结构体,不能指向结构体成员若有STREC std,*pstd, pers3; 则sp=&pers2.num 错误#include stdio.hmain( ) struct studentlong num;char name20;char sex;float score; s1=20001,Li Li,M
15、,85;struct student s2;float sum, ave;scanf(%ld %s %c %f,&s2.num,,&s2.sex,&s2.score);sum=s1.score+s2.score;ave=sum/2;printf(NOtNAMEtSEXtSCOREn);printf(%ldt%st%ct%5.1fn,s1.num,,s1.sex,s1.score);printf(%ldt%st%ct%5.1fn,s2.num,,s2.sex,s2.score);printf(sum=%5.1ftave=%5.1fn,sum,ave);定
16、义结构体student,并初始化变量s1即第1个学生信息。定义变量s2、sum、ave【例10.1】 结构体类型变量的引用示例:求两个学生总成绩及平均成绩输入第2个学生信息计算这两个学生的总成绩、平均成绩输出标题信息输出这两个学生信息输出其总成绩、平均成绩例10.1(源代码)#include stdio.h#define N 10main( ) struct student int num; float score; studN;float ave=0,max;int i, k=0;printf(input: num, name, score);for(i=0; iN; i+) scanf(%
17、ld,%f,&studi.num,&studi.score);ave=ave+studi.score; ave=ave/N;max=stud0.score;for (i=1; iN; i+)if(maxnum);printf(%st%st%sn,,(*sp).name, sp-name); printf(%5.2ft%5.2ft%5.2fn,stu1.score,(*sp).score ,sp-score);【例10.3】结构体指针变量的应用:求N个学生最高分及平均成绩例10.3(源代码)勘误:P235 sp前加星号#include stdio.hstruct student
18、long num;char name20;float score;struct student stu3= 20001,Li Li,85,20002,Wu an,78,20003,Ma Lin,69;main( )struct student *p;printf(学号t姓名t成绩n);for(p=stu;pnum,p-name,p-score);【例10.4】结构体指针变量的应用:求N个学生最高分及平均成绩例10.4(源代码)学号姓名成绩20001Li Li85.00000020002Wu an78.00000020003Ma Lin69.000000输出结果:2. 对结构体类型变量的整体赋值
19、同种类型的结构体变量之间可以进行整体赋值操作。例如:struct studentlong num; char name20: char sex; int age; float score; std1, std2=11011, Yang Lin, M, 18, 89;std1=std2; 实际上是将std2的成员分别赋给std1中对应的同名成员。 函数之间结构体变量的数据传递3种传递方式: 用结构体变量的成员作参数 结构体变量的成员可以看做普通变量。 用指向结构体的指针作参数 结构体变量的整体双向传递,形参的改变会影响到实参。 用结构体变量的整体作参数 结构体变量的整体单向传递,形参的改变不会影
20、响到实参。 例题10.5例题10.6例题10.7传递整体传递成员6. 用指针处理链表 链表作为一种常用的、能够实现动态存储分配的数据结构,是二级公共基础的数据结构部分的要点之一。 链即用指针连接数据结点。本节重点讲述单链表,其模型如下: a1anhead(1)头指针head指向链表的首结点。(2)每个结点由2个域组成:数据域存储结点本身的信息。指针域指向后继结点的指针。(3)尾结点的指针域置空( NULL ),作为链表结束的标志数据域 指针域1链表概述a1a2anhead语言对链表结点的结构描述 在语言中,用结构类型来描述结点结构。例如: struct slist int data;/*数据域
21、*/ struct slist *next;/*指针域*/ ;typedef struct slist SLIST;用于动态分配空间的3个标准函数(stdlib.h)malloc(size); 在内存的动态区申请1个长度为size的存储单元calloc(n,size); 在内存的动态区申请n个长度为size的存储单元free(*ptr); 释放由ptr指向的存储单元2. 链表的建立例10.8 编写一个creat( )函数用于建立一个有5名学生基本数据的单向链表。其算法步骤为:(1) 定义一个描述学生基本数据的结构体类型。(2) 定义三个指向结构体的指针p,q和head。其中head为头指针;p
22、为当前结点的指针;q为当前链表的表尾结点指针。(3) 建立第一个结点(4) 建立其它节点并完成与当前链表的链接。重复步骤(4)就可以完成链表的建立。#define N 5#define LEN sizeof(STUD)struct studentint num; float score; struct student *next;typedef struct student STUD ; /* 第(1)步 */STUD *creat( )STUD *head,*p,*q;/* 第(2)步 */ int i; p=( STUD *)malloc(LEN); scanf(%d,%f,&p-num,
23、&p-score); p-next=NULL; head=p; q=p; /* 第(3)步 */ for(i=1;inext=NULL; scanf(%d,%f,&p-num,&p-score); q-next=p; q=p; /* 第(4)步 */ return(head);3. 链表的输出例10.9 编写输出链表的函数print( ) 通过单链表的头指针,首先找到链表的第一个结点;然后顺着结点的指针域将搜索到的每个节点的数据域的值输出void print(STUD *head) STUD *p; p=head; while(p!=NULL) printf(%d,%fn,p-num,p-sc
24、ore); p=p-next; /*指针移向下一个结点*/ 4. 链表的删除例10.10 编写函数delete( )实现链表的删除操作基本思路: 通过单链表的头指针,首先找到链表的第一个结点;然后顺着结点的指针域找到学号为num的结点,修改其前一个节点的指针域的值,使他指向他的下一个结点。q-next=p-next;free(p);STUD *delete(STUD *head,int num)STUD *p,*q; if(head=NULL) printf(list null!);return(0); p=head; while(num!=p-num & p-next!=NULL)* p指向
25、的不是要找的结点,并且后面还有结点* q=p;p=p-next; *向后移一个结点* if(num=p-num) *找到了待删结点* if(p=head) head=p-next;* 待删的是第一个结点 * else q-next=p-next;* 待删的不是第一个结点 * printf(delete :%dn,p-num); free(p); else *没有找到待删结点* printf(%ld not been found!n,num); return(head);5. 链表的插入例10.11 编写插入结点的函数insert( ),实现在有序链表中结点的插入操作(假设链表按照num(学号)
26、从小到大顺序排列)。基本思路: 通过单链表的头指针,首先找到链表的第1个结点;然后顺着结点的指针域找到值为x的节点,然后将新结点y插入。q-next=p;r-next=q;STUD *insert(STUD *head,STUD *stud) STUD *p,*q,*p0; p=head; /* 设置扫描指针p */ p0=stud; *p0指向要插入的结点* if(head=NULL) *原来是空表* head=p0;p0-next=NULL; else while(p0-nump-num) & (p-next!=NULL) q=p;pp-next; if(p0-numnum) if(hea
27、d=p)headp0;*插到原来第一个结点之前* else q-next=p0; *插到q指向的结点之后* p0-next=p; else p-next=p0;p0-next=NULL;*插到最后的结点之后* return(head);例10.12 编写主函数调用以上各函数STUD *creat( );void print(STUD *head);STUD *delete(STUD *head,int num);STUD *insert(STUD *head,STUD *stud);main( ) STUD *head ,*stu; int del_num; printf(input reco
28、rds :n); head=creat( ); * 建立单链表,返回头指针 * print(head); *输出链表中全部结点数据域的值* printf(input the deleted number:); scanf(%d,&del_num);*输入要删除的学号* while(del_num!=0) head=delete(head,del_num);* 返回删除结点后链表的头指针 * print(head); printf(input the deleted number:); scanf(%d,&del_num);*输入要删除的学号* printf(input the inserted
29、 record:n); stu=(STUD *)malloc(LEN); scanf(%d,%f,&stu-num,&stu-score);*输人要插入的记录* while(stu-num!=0) head=insert(head,stu);*返回插入新结点后的链表头指针* print(head); printf(input the inserted record:n); stu=( STUD *)malloc(LEN); scanf(%d,%f,&stu-num,&stu-score);*输人要插入的记录* 共用体是指不同类型的数据可以在不同的时间内使用共同的内存单元。尽管这些在内存中占的字
30、节数不同,但都从同一起始地址开始存放。而且是在不同的时间内去使用该内存单元。 共用体实际上是C语言提供的一种覆盖技术。10.3 共 用 体 char sexshort num float score 共用体的定义、使用形式同结构体相似。 union 共用体名 类型名1 共用体成员名表1; 类型名2 共用体成员名表2; 类型名n 共用体成员名表n;;1. 共用体类型的定义 union student int num; char sex; float score; union student stu1,stu2; typedef union int num; char sex; float sco
31、re; UN; UN s1,s2; union int num; char sex; float score; stu1,stu2; union student int num; char sex; float score; stu1,stu2;2. 共用体变量的定义3. 共用体变量的引用方式共用体的使用也与结构体相同,用&取共用体的地址,用“. ” 或“-”访问共用体成员。例如: stu1.num(引用共用体变量中的整型变量num) stu1.sex (引用共用体变量中的字符变量sex) stu1.score(引用共用体变量中的实型变量score) 1、同一个内存段可以用来存放几种不同类型的
32、成员,但在每一瞬时只能存放其中一种。 2、共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。如有以下赋值语句: stu1.num=101; stu1.sex=F; stu1.score=89.5;在完成以上三个赋值运算以后,只有stu1.score是有效的,stu1.num和stu1.sex已经无意义了。共 用 体 使 用 说 明3、共用体变量的地址和它的各成员的地址都是同一地址4、不能对共用体变量名赋值,也不能企图引用变量名来得到成员的值,也不能在定义共用体变量时对它初始化。5、不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以使用指向共用
33、体变量的指针(与结构体变量这种用法相仿)。6、共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。例如: struct date int day; int month; int year; union int sh1; float sh2;sh; a;举 例例 10.13 分析下列程序的运行结果 main() union char c2; int k;r; r.c0=2; r.c1=0; r.k=20; printf(%d,%d,%dn,r.k,r.c0,r.c1);20,20,0【例10.14】分析下列程序的输出结
34、果 union as int a; int b; s3,*p;main() int n=1,k; for(k=0;ka,+p-a);3,3+p-a, p-a);3,2+p-a, +p-a);4,3共用体与结构体的区别struct exam int a ; float b ; char c ; x ;xabcunion exam int a ; float b ; char c ; x ;xb ac 结构变量的每个成员有独立的内存单元,而共用体变量的成员以最大的成员开辟单元后,所有成员共用该单元。sizeof (struct exam)10.4 枚 举 类 型枚举类型的定义格式:enum 枚举类型标识符 枚举元素表列;例如:enum daysun,mon,tue,wed,thu,fri,sat; 以上定义了一个枚举类型enum day,有个枚举元素。可以用此类型来定义变量。enum day workday; workday被定义为枚举变量,它的值只能是sun到sat之一。可以用通常给变量赋值的方法给枚举变量赋值。 例如:workday=mon;当然,也可以直接定义枚举变量,如:enum sun,mon,tue,wed,thu,fri,satworkday;说 明(1)对枚举类型的定义和枚举变量的使用,其
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 林业火灾扑救设备制造考核试卷
- 畜产品加工工艺改进与优化考核试卷
- 2025年中国高频振筛市场调查研究报告
- 2025年中国铣床专用电磁离合器市场调查研究报告
- 电子专用设备的生产效率优化考核试卷
- 2025年中国花岗岩锯片市场调查研究报告
- 物流设备在物流成本控制中的作用考核试卷
- 木片加工安全操作规程与事故预防考核试卷
- 租赁设备市场租赁设备市场供需分析考核试卷
- 电池电化学性能研究考核试卷
- 2025年广东省广州市华兴教育港澳台联考学校高考英语二模试卷
- 2025-2030显示电源管理IC行业市场现状供需分析及重点企业投资评估规划分析研究报告
- 盘扣双包合同协议
- (四调)武汉市2025届高中毕业生四月调研考试 历史试卷(含答案)
- 2025年共青团入团积极分子考试测试试卷题库及答案
- 维克多高中英语3500词汇
- 水塘排水、清淤质量检验记录表
- 上海龙之梦丽晶大酒店客房预订单
- 水污染控制工程课程设计说明书
- 妇产科学孕期B族链球菌感染课件
- 建筑工程施工质量控制要点ppt课件
评论
0/150
提交评论