第十一章结构体与共用体 学习目的与要求:1.掌握结构体变量的定义与引用 2.重点掌握链表的建立、插入、删除、输出等操作。 3.了解共用体变量的定义与引用 1.掌握结构体变量的定义与引用。 2.重点掌握链表的建立、插入、删除、输出等操作。 3. switch语句。 第1讲 知识归纳 1.结构体和结构体变量的定义 格式一: tuct结构体名 ∥定义结构体 类型成员名 此是不能 struct结构体名变量名1,变量名2……;∥定义结构体变量 格式二 struct结构体名 ∥定义结构体与变量 类型成员名; }变量名1,变量名2……; (1)注意:只能对结构体变量赋值、存取或运算,而不能对结构体赋值、存取或运算 结构体是一个数据类型,与int, folat一样,都是数据类型,所以数据类型本身不能获值, 只不过结构体类型是一个构造数据类型,与数组类似 (2)一个结构体变量所占的存储空间,是各个成员所占空间的和。 2.结构体变量的引用 格式:结构体变量名成员名 )不能将一个结构体变量作为一个整体进行输入和输出,只能对结构体变量中的各 个成员分别进行输入和输出;结构体变量中的各个成员等价于普通变量 (2)一是成员运算符:他在所有运算符中优先级最高。 (3)结构体变量的成员可以进行各种运算
第十一章 结构体与共用体 学习目的与要求:1. 掌握结构体变量的定义与引用。 2. 重点掌握链表的建立、插入、删除、输出等操作。 3. 了解共用体变量的定义与引用。 重点: 1. 掌握结构体变量的定义与引用。 2. 重点掌握链表的建立、插入、删除、输出等操作。 3. switch 语句。 第 1 讲 知识归纳 1. 结构体和结构体变量的定义 格式一: struct 结构体名 //定义结构体 { 类型 成员名; } ; 此处分号不能少; struct 结构体名 变量名 1,变量名 2……;//定义结构体变量 格式二: struct 结构体名 //定义结构体与变量 { 类型 成员名; } 变量名 1,变量名 2……; (1) 注意:只能对结构体变量赋值、存取或运算,而不能对结构体赋值、存取或运算 ; 结构体是一个数据类型,与 int , folat 一样,都是数据类型,所以数据类型本身不能获值, 只不过结构体类型是一个构造数据类型,与数组类似。 (2) 一个结构体变量所占的存储空间,是各个成员所占空间的和。 2. 结构体变量的引用 格式:结构体变量名.成员名; (1) 不能将一个结构体变量作为一个整体进行输入和输出,只能对结构体变量中的各 个成员分别进行输入和输出 ;结构体变量中的各个成员等价于普通变量。 (2) .—是成员运算符;他在所有运算符中优先级最高。 (3) 结构体变量的成员可以进行各种运算
C语言程序设计上机指导与同步训练 char name [101 float scor student1 scanf( &student num, studentI name &student. age &student1 score); student age++i 3.结构体数组 (1)先定义结构体类型。 (2)然后定义结构体类型数组,方法同普通类型数组的定义。 char name [101 int age float score tudent [5] student [o]. score =480 4.指向结构体变量或数组的指针 (1)通过指向结构体变量或数组的指针,访问结构体变量或数组的成员的格式。 p)成员名 →成员名 等价于结构体变量.成员名 称为指向运算符;与成员运算符()一样,级别最高 [ int num struct strdent* p (*p).num=1001; strcpy (p-> name "Wanglin")i (*p).age=20; 基础训练(A) 填空题 1.定义结构体的关键字是
·256· C 语言程序设计上机指导与同步训练 ·256· 如: struct strdent { int num ; char name [10] ; int age ; float score; } student1 ; scanf( “%d %s%d%f” , &student1.num,student1.name , &student1.age ,&student1.score) ; student1.age++ ; 3. 结构体数组 (1) 先定义结构体类型。 (2) 然后定义结构体类型数组,方法同普通类型数组的定义。 struct strdent { int num ; char name [10] ; int age ; float score; } student [5] ; student[0].score = 480; 4. 指向结构体变量或数组的指针 (1) 通过指向结构体变量或数组的指针,访问结构体变量或数组的成员的格式。 ( * p ) . 成员名 ; p 成员名; 等价于 结构体变量. 成员名; -------称为指向运算符;与成员运算符(.) 一样,级别最高; 如: struct strdent { int num ; char name [10] ; int age ; float score; } student1 ; struct strdent* p ; p = &student1 ; (*p).num=1001; strcpy(p-> name , “Wanglin”); (*p).age=20; p -> score=480 ; 基础训练(A) 一、填空题 1. 定义结构体的关键字是____________。
第二部分¢语言程序设计同步训练 2.一个结构体变量所占用的空间是 3.有如下定义并初始化,请填写输出语句 struct person (char name [9] struct person class[4]=i"John",17 Mary, 18 nadam,16 maln ( t int i (i=0;i<4;i++) 4.指向结构体数组的指针的类型是 5.通过指针访问结构体变量成员的两种格式 、选择题 1.当说明一个结构体变量时系统分配给它的内存是() A)各成员所需内存量的总和 B)结构中第一个成员所需内存量 C)成员中占内存量最大者所需的容量 D)结构中最后一个成员所需内存量 2.在如下结构体定义中,不正确的是( A)struct teacher B)struct tea[ 201 char name[10] float sal C)struct teacher D)struct Int no: int ne char name[101 char name[ 101 float score, g tea[201 i stud[ 100] 3.根据下面的定义,能打印出May的语句是( struct person (char name[9]: int age struct person class [10]=i"John",17
第二部分 C 语言程序设计同步训练 ·257· ·257· 2. 一个结构体变量所占用的空间是____________________。 3. 有如下定义并初始化,请填写输出语句。 struct person {char name[9]; int age; } struct person class[4]={“John”,17, “Paul”,19, “Mary,18, “adam”,16 } main() { int i; for ( i=0;i<4;i++) printf(______________________________) 。 } 4. 指向结构体数组的指针的类型是___________________。 5. 通过指针访问结构体变量成员的两种格式______________和_______________。 二、选择题 1. 当说明一个结构体变量时系统分配给它的内存是( )。 A) 各成员所需内存量的总和 B) 结构中第一个成员所需内存量 C) 成员中占内存量最大者所需的容量 D) 结构中最后一个成员所需内存量 2. 在如下结构体定义中,不正确的是( )。 A)struct teacher B) struct tea[20] { { int no; Int no; char name[10]; char name[10] float salary float salary; } } C) struct teacher D) struct { { int no; int no; char name[10]; char name[10] float score; float score; } tea[20]; }stud[100]; 3. 根据下面的定义,能打印出 Mary 的语句是( )。 struct person {char name[9]; int age; } struct person class[10]={“John”,17, “Paul”,19
C语言程序设计上机指导与同步训练 Mary, 18, adam",16 A)rintf("%oc\n, class[3]. name); B)rintf( %cn,, class[1]. name[l)); C)printf("%ocin class(2 name) D)printf("%cn,, class[O] name 4.若有以下说明和语句 struct student )std,*p 则以下对结构体变量std中成员age的引用方式不正确的是( A)std age B) C)(°p).age p age 三、编程题 1.定义一个能正常反映教师情况的结构体 teacher,包含教师姓名、性别、年龄、所在部 门和薪水。 能力提高(B) 、填空题 1.以下程序用以输出结构体变量所占内存单元的字节数,请在」 内填上适当的 内容。 double x char str[50]i in() [struct per bt; printf(” bt size=dln 2.有如下定义 struct int xi char★ }tab[2]={{1,"ab"},{2,"ca"}},*p=tab 则:表达式*p>y的结果是 表达式*(++p)y的结果是 3.有如下定义
·258· C 语言程序设计上机指导与同步训练 ·258· “Mary,18, “adam”,16 } A) rintf(“%c\n”,class[3].name); B) rintf(“%c\n”,class[1].name[1]); C) printf(“%c\n”,class[2].name); D) printf(“%c\n”,class[0].name); 4. 若有以下说明和语句: struct student { int age; int num; }std, *p; p=&std; 则以下对结构体变量 std 中成员 age 的引用方式不正确的是( )。 A) std.age B) p->age C) (*p).age D) *p.age 三、编程题 1. 定义一个能正常反映教师情况的结构体 teacher,包含教师姓名、性别、年龄、所在部 门和薪水。 能力提高(B) 一、填空题 1. 以下程序用以输出结构体变量所占内存单元的字节数,请在_______内填上适当的 内容。 struct per { double x; char str[50]; }; main() {struct per bt; printf(“ bt size =%d\n”,_____________); } 2. 有如下定义 struct { int x; char *y; }tab[2]={{1,”ab”},{2,”cd”}}, *p=tab; 则:表达式*p->y 的结果是____________ 。 表达式 *(++p)->y 的结果是________________ 。 3. 有如下定义
第二部分¢语言程序设计同步训练 i int year, month, day; struct data birthdayi 对结构体变量 personl的出生年份(1980)进行赋值,请填写正确的赋值语句 4.结构数组中存有三人的姓名和年龄,以下程序输出三人中年龄最年长者的姓名和年 龄,请在 内填入正确内容 static struct man char name [20] )person[ ]=["liming",18 wanghua",19 zhangping",20 [struct int old=0 printf(w旨s旨d 、选择题 1.以下程序的运行结果是( #include fint year printf("gd\n", sizeof (struct date))i 2.若有以下说明和语句,则对pup中sx域的正确引用方式是(D)1 A)6 C)10 struct pupil p=&pupi
第二部分 C 语言程序设计同步训练 ·259· ·259· struct date { int year,month,day; } struct person { char name[8]; char sex ; struct data birthday; } person1; 对结构体变量 person1 的出生年份(1980)进行赋值,请填写正确的赋值语句: __________________________________; 4. 结构数组中存有三人的姓名和年龄,以下程序输出三人中年龄最年长者的姓名和年 龄,请在____________内填入正确内容。 static struct man { char name[20]; int age; }person[ ]={“liming”,18, “wanghua”,19, “zhangping”,20 }; main() {struct man *p, *q; int old=0; p=person; for(;p______________;p++) if(oldage) {q=p; ________________;} printf(“%s %d”, ________________); } 二、选择题 1. 以下程序的运行结果是( )。 #include main() {struct date {int year,month,day; }today; printf(“%d\n”,sizeof(struct date)); } A) 6 B) 8 C) 10 D) 12 2. 若有以下说明和语句,则对 pup 中 sex 域的正确引用方式是( )。 struct pupil {char name[20]; int sex; }pup, *p; p=&pup;
C语言程序设计上机指导与同步训练 A)ppup.sex B)p->pup.sex C)(p).pup. sex D)(p).sex 3.若有以下程序段: iint int a=l, b=2,C=3 struct dent s[3]={{101,&a},{102,b},{103,&c}}; 则以下表达式中值为2的是()。 A)(p++}>m *(p++)>m C)(p).m D)*(++p)>m 编程题 1.定义一个能正常反映教师情况的结构体 teacher,包含教师姓名、性别、年龄、所在部 门和薪水;定义一个能存放两人数据的结构体数组tea,并用如下数据初始化 {"Mary“,W,40, Computer',1234},{“Andy“,"M’s, nglish’,1834};要求:分别 用结构体数组tea和指针p输出各位教师的信息,写出完整定义、初始化、输出过程: 2.有5个学生,每个学生的数据包括学号(num),姓名(name),总成绩( score)编程实 现从键盘输入5位学生数据,按总成绩由高到低排序,输出排序后的学号、姓名、总成绩(为 了简化问题,提示同学们可以将总成绩定义为int;另,在排序交换时,不能只交换总成 绩变量值)。 第2讲 知识归纳 1.链表概述 (1)链表有一个“头指针”变量:他存放链表第一个结点的地址 (2)链表中每一个元素称为一个结点,每个结点都包括两部分:一个是数据域:一个 是指针域:数据域用来存放用户数据,指针域用来存放下一个结点的地址。 (3)链表的最后一个结点的指针域常常设置为NUL(空,表示链表到此结束 (4)常常用结构体变量作为链表中的结点。 2.链表的操作 (1)链表的静态创建 (2)链表的动态创建 三个函数:
·260· C 语言程序设计上机指导与同步训练 ·260· A) p.pup.sex B) p->pup.sex C) (*p).pup.sex D) (*p).sex 3. 若有以下程序段: struct dent { int no; int *m; }; int a=1,b=2,c=3; struct dent s[3]={{101,&a},{102,&b},{103,&c}}; main() { struct dent *p; p=s; … } 则以下表达式中值为 2 的是( )。 A) (p++)->m B) * (p++)->m C) (*p).m D) *(++p)->m 三、编程题 1. 定义一个能正常反映教师情况的结构体 teacher,包含教师姓名、性别、年龄、所在部 门和薪水;定义一个能存放两人数据的结构体数组 tea,并用如下数据初始化: {{“Mary “, ‘W’,40, ‘Computer’ , 1234 },{“Andy “, ‘M’,55, ‘English’ , 1834}} ;要求:分别 用结构体数组 tea 和指针 p 输出各位教师的信息,写出完整定义、初始化、输出过程; 2. 有 5 个学生,每个学生的数据包括学号(num) , 姓名(name) , 总成绩(score) ,编程实 现从键盘输入 5 位学生数据,按总成绩由高到低排序,输出排序后的学号、姓名、总成绩(为 了简化问题,提示同学们可以将总成绩定义为 int ;另,在排序交换时,不能只交换总成 绩变量值)。 第 2 讲 知识归纳 1. 链表概述 (1) 链表有一个“头指针”变量;他存放链表第一个结点的地址。 (2) 链表中每一个元素称为一个结点,每个结点都包括两部分:一个是数据域;一个 是指针域;数据域用来存放用户数据,指针域用来存放下一个结点的地址。 (3) 链表的最后一个结点的指针域常常设置为 NULL (空), 表示链表到此结束。 (4) 常常用结构体变量作为链表中的结点。 2. 链表的操作 (1) 链表的静态创建。 (2) 链表的动态创建。 三个函数:
第二部分¢语言程序设计同步训练 61 calloc(函数 格式:void* malloc( unsigned int size) 功能:在内存的动态存储区中分配1个长度为size的连续空间。 函数的返回值:申请存储空间成功,返回申请的存储空间的起始地址,申请不成功, 回Nul 函数 Fr: vod calloc(unsigned n, unsigned int size 功能:在内存的动态存储区中分配n个长度为size的连续空间。 函数的返回值:申请存储空间成功,返回申请的存储空间的起始地址,申请不成功返 回NULL fre6(函数: free(函数: 格式: void free(void) 功能:释放由p指针指向的内存区,使这部分内存区能被其他变量使用 Free函数无返回值 基础训练(A 、填空题 1.链表有一个“头指针”变量,专门用来存放 2.常常用结构体变量作为链表中的结点,每个结点都包括两部分:一个是 一个是 3.链表的最后一个结点的指针域常常设置为 表示链表到此结束; 4.为建立如图所示的存储结构(即每个节点两个域,data是数据域,next是指向节点的 指针域,请将定义补充完整)。 (char da 5.以下静态建立一个有2个学生数据的链表,并输出各结点中的数据 #include NULL 0 # include“ stdio.h struct student float score struct student link;
第二部分 C 语言程序设计同步训练 ·261· ·261· malloc( )函数: 格式: void *malloc(unsigned int size); 功能:在内存的动态存储区中分配 1 个长度为 size 的连续空间。 函数的返回值:申请存储空间成功,返回申请的存储空间的起始地址,申请不成功, 返回 Null calloc( )函数: 格式:vod * calloc(unsigned n,unsigned int size); 功能:在内存的动态存储区中分配 n 个长度为 size 的连续空间。 函数的返回值:申请存储空间成功,返回申请的存储空间的起始地址,申请不成功返 回 NULL free( )函数: free ()函数: 格式:void free(void *p) 功能:释放由 p 指针指向的内存区,使这部分内存区能被其他变量使用。 Free 函数无返回值。 基础训练(A) 一、填空题 1. 链表有一个“头指针”变量,专门用来存放___________________________。 2. 常常用结构体变量作为链表中的结点,每个结点都包括两部分:一个是 ___________;一个是________________。 3. 链表的最后一个结点的指针域常常设置为__________, 表示链表到此结束; 4. 为建立如图所示的存储结构(即每个节点两个域,data 是数据域,next 是指向节点的 指针域,请将定义补充完整)。 data next struct node {char data; _______________________; } v1 ; 5. 以下静态建立一个有 2 个学生数据的链表,并输出各结点中的数据。 #include NULL 0 #include “stdio.h” struct student { int num ; float score ; struct student * link; };
C语言程序设计上机指导与同步训练 I struct student a, b, *head ,*p a. num= 0001 a score =459 a. num= 0002 :a score =586 b. link NULL printf("d,影5.1f\mn y while(p!=NULL 选择题 1.已知head指向单链表的第一个节点,以下程序调用函数 print输出这一单向链表 请选择正确内容填空 #include #include struct student struct student *link; void print(struct student head) if (head!=NULL) { printf("暑d while(p!=NULL)i (1)A)p->info (2)A)p->link=p B)P=p->link C)P=NULL 能力提高(B) 填空题 1.若要利用下面的程序片段使指针变量p指向一个存储整形变量的存储单元,则 中应填入的内容是什么? int *p 2.已知head指向一个带头节点的单项链表,链表中每个节点包含数据域(data)和指针 域(next),数据域为整型。以下过程求出链表中所有链节点数据域的和值。请在 内填入正确内容
·262· C 语言程序设计上机指导与同步训练 ·262· main() { struct student a, b , *head , * p ; a. num= 0001 ; a.score = 459; a. num= 0002 ; a.score = 586; head = &a; a.link= _______________; b.link = NULL; p = head ; do { printf ( “%d , %5.1f\n” , _________________) ; p = ____________ ; } while(p!=NULL); } 二、选择题 1. 已知 head 指向单链表的第一个节点,以下程序调用函数 print 输出这一单向链表。 请选择正确内容填空____________。 #include : #include : struct student { int info; struct student *link; }; void print(struct student * head) { struct student *p; p=head; if(head!=NULL) do {printf(“%d”, ____________); _______________; } while(p!=NULL); } (1) A) p->info B) *p.info C) info D) (*p).link (2) A) p->link=p B) p=p->link C) p=NULL D) p++ 能力提高(B) 一、填空题 1. 若要利用下面的程序片段使指针变量 p 指向一个存储整形变量的存储单元,则____ 中应填入的内容是什么? int *p; p=___________malloc(sizeof(int)); 2. 已知 head 指向一个带头节点的单项链表,链表中每个节点包含数据域(data)和指针 域(next),数据域为整型。以下过程求出链表中所有链节点数据域的和值。请在___________ 内填入正确内容
第二部分¢语言程序设计同步训练 263· struct link p= head->next printf("s=器d\n”,s) 3.以下动态建立一个学生数据的链表,写出创建链表的函数 create,以学号为0表示 输入结束,在 处填写正确内容 #include NULL 0 int float score struct student struct student *create(void I struct student *head *pl,*p2; n=0 pl=p2=( struct student *)malloc( scanf(”詈df",&p1->num,p1-> score); while(pl->numI=0) n=n+1; pl=p2=( struct student malloc(sizeof (struct student)) scanf("暑d暑f”,p1->num,&p1-> score) 选择题 1.已知head指向单链表的第一个节点,以下函数del完成从单向链表中删除值为num 的第一个结点。请选择正确内容填空。 #include <stdio. h struct student t int info struct student *link struct student *del(struct student *head, int num
第二部分 C 语言程序设计同步训练 ·263· ·263· struct link { int data; struct link next; }; main() { struct link *head , *p; int s =0; p= head->next; while(p! =NULL) { s+=________________; p = __________________; printf(“s=%d\n”,s ); } 3. 以下动态建立一个学生数据的链表,写出创建链表的函数 create,以学号为 0 表示 输入结束,在___________处填写正确内容。 #include NULL 0 #include struct student { int num ; float score ; struct student * next ; }; int n ; struct student *create(void) { struct student *head , * p1,*p2 ; n=0 ; p1=p2=( struct student * ) malloc(_________________) ; scanf (“%d%f”,&p1->num ,&p1->score); head = NULL; while(p1->num!=0) { n=n+1; if (n==1) head = p1; else _____________________; p2=p1; p1=p2=( struct student * ) malloc(sizeof(struct student)) ; scanf ( “%d%f”,&p1->num ,&p1->score); } p2->next =NULL; } 二、选择题 1. 已知 head 指向单链表的第一个节点,以下函数 del 完成从单向链表中删除值为 num 的第一个结点。请选择正确内容填空。 #include struct student { int info; struct student *link; }; struct student *del(struct student *head, int num)
C语言程序设计上机指导与同步训练 struct student *pl, *p2 if(head ==NULL else ile( num!=pl->infor & pl->link !=NULL) p1=p1->1ink;} lif( printf( Mdelete:旨dln”,num); else printf(”暑 d not been found!n",num) return (head) (1)A)p2=pl->link B)head= pl C)head=pl->link D)pl->link=head (2)A)head B)pI->link C)p D)pI->info 、编程题 建立一个教师链表,每个结点包括学号(no),姓名(name8]),工资(wage),写出动 态创建函数 creat和输出函数 print. 2.在上一题基础上,假如已经按学号升序排列,写出插入一个新教师的结点的函数 第3讲 知识归纳 1.共用体 (1)概念:使几个不同的变量共占同一段内存的结构,称为共用体 (2)共用体定义格式 union共用体名 }变量表列 (1)共用体变量所占内存长度等于最长的成员的长度。 (2)不能直接引用共用体变量,只能引用共用体变量中的成员。 引用格式:共用体变量.成员名;
·264· C 语言程序设计上机指导与同步训练 ·264· { struct student *p1,*p2; if(head = =NULL) printf(“\n list null! \n”); else {p1=head; while( num!=p1->infor && p1->link !=NULL) { p2=p1; p1=p1->link; } if(num==p1->info) {if(p1= =head) _____________; else p2->link =_________________; printf(“delete:%d\n”,num); } else printf(“%d not been found! \n”,num); } return (head); } (1) A) p2=p1->link B) head= p1 C) head=p1->link D) p1->link=head (2) A) head B) p1->link C) p1 D) p1->info 三、编程题 1. 建立一个教师链表,每个结点包括学号(no),姓名(name[8]),工资(wage),写出动 态创建函数 creat 和输出函数 print。 2. 在上一题基础上,假如已经按学号升序排列,写出插入一个新教师的结点的函数 Insert。 第 3 讲 知识归纳 1. 共用体 (1) 概念:使几个不同的变量共占同一段内存的结构,称为共用体。 (2) 共用体定义格式: union 共用体名 { 成员表列; } 变量表列; 如: union { int i; char ch; float f; } a , b, c ; (1) 共用体变量所占内存长度等于最长的成员的长度。 (2) 不能直接引用共用体变量,只能引用共用体变量中的成员。 引用格式:共用体变量. 成员名;