1、,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,#,9.1.1,结构体类型的定义,结构体,类型,定义,的一般形式:,struct,标识符,类型名,1,成员名,1;,类型名,2,成员名,2;,类型名,n,成员名,n;,;,9.1.1,结构体类型的定义,例,1,对某一学生数据(由学生的学号、姓名、性别、年龄、家庭地址等数据项组成)的结构体类型定义如下:,struct student,int num;,char name20;,char sex;,int age;,char addr30;,;,(,5,),结构体类型定义的嵌套,。,例,2,:若某一学生数据包括学
2、号、姓名、性别、出生年月、家庭地址,其中出生年月包括出生的年、月、日三个数据,则对某一学生数据的结构体类型定义如下:,再定义,student,结构体:,struct student,int num;,char name20;,char sex;,struct date,birthday,;,char addr30;,;,先定义,date,结构体:,struct date,int year;,int month;,int day,;,;,9.1.1,结构体类型的定义,9.1.2,结构体变量的定义,结构体变量的定义,有三种处理方式:,(,1,)先定义结构体类型,再定义结构体变量。,例,1,:,st
3、ruct,student,int num;,char name20;,char sex;,int age;,char addr30;,;/*,定义结构体类型,struct student*/,struct student,a,b;,/*,定义,a,、,b,为结构体类型,struct student,的变量*,/,9.1.2,结构体变量的定义,(,2,)在定义结构体类型的同时定义结构体变量。,例,2,:,struct student,int num;,char name20;,char sex;,int age;,char addr30;,a,b,;,9.1.2,结构体变量的定义,(,3,)直接
4、定义结构类型变量。,例,3,:,struct,int num;,char name20;,char sex;,int age;,char addr30;,a,b,;,9.1.3,结构体变量的引用,(,1,)引用结构体变量的成员。,格式,:,结构体变量名,成员名,struct date,int year;,int month;,int day,;,;,struct student,int num;,char name20;,char sex;,struct date birthday,;,char addr30;,;,struct student a,b;,a.name,=Li Fang;,b,
5、.,birthday,.,day=12;,9.1.3,结构体变量的引用,对结构体变量中的成员都可以像同类型的普通变量一样进行各种运算。,例,3,:,a.num=060001+5,;,b.birthday.day+,;,(,2,)结构体变量作为一个整体引用,.,结构体变量不可以作为整体进行输入输出,但可以作为函数的参数或返回值而被整体引用,,也可以将一个结构体变量作为一个,整体赋给,另一个具有相同类型的结构体变量。,例,1,:,struct student a,b;,a=b,;,(,3,)引用结构体变量的地址或成员的地址,struct student a,b;,scanf(%d,printf(%
6、x,printf(%x,9.1.3,结构体变量的引用,9.1.4,结构体变量的初始化,结构体变量的初始化形式有如下两种:,(,1,),struct,标识符,类型名,1,成员名,1;,类型名,2,成员名,2;,类型名,n,成员名,n;,变量名,=,数据表,;,例,1,:,struct student,int num;,char name20;,char sex;,int age;,char addr30;,a=060001,Li Fang,F,18,Wuhan;,(,2,)结构体类型名 变量名,=,数据表,;,例,2,:,struct student,int num;,char name20;,
7、char sex;,int age;,char addr30;,;,struct student,a=060001,Li Fang,F,18,Wuhan;,9.1.3,结构体变量的引用,9.2,结构体数组,9.2.1,结构体数组的定义,结构体数组定义的一般形式:,结构体类型名 数组名,常量表达式,;,例,1,:,struct student,int num;,char name20;,char sex;,int age;,char addr30;,;/*,定义结构体类型,struct student*/,struct student a5;,/*,定义,a5,结构体类型,struct stud
8、ent,的数组*,/,9.2.2,结构体数组元素的引用,格式,:,结构体数组名,元素下标,.,结构体成员名,例,1,:,struct student,int num;,char name20;,char sex;,int age;,char addr30;,a5;,a0.num=060001;,a1.name=Lin Hong;,一个结构体数组元素相当于一个结构体变量,其处理方法与结构体变量的处理方法相同,9.2.2,结构体数组元素的引用,例,2,:,struct student,int num;,char name20;,char sex;,int age;,char addr30;,a5;
9、,scanf(%d,gets(a0.name);,scanf(%c,scanf(%d,gets(a0.addr);,a3=a0;,printf(%x,printf(%x,9.2.3,结构体数组的初始化,结构体数组也可以在定义的同时进行数组元素的初始化。,例如:,struct student,int num;,char name20;,char sex;,int age;,char addr30;,a5=060001,Li Fang,F,18,Wuhan,060230,Lin Hong,F,16,Changsha;,;,9.2.4,应用举例,例,9.1,输入如表,9-1,所示的学生情况登记表,按
10、学号顺序整理输出该表。,分析如下:,1,、定义学生类型及学生数组,:,2,、输入学生信息,3,、输出学生信息,(程序由学生和老师共同完成),struct student,int num;,char name20;,char sex;,int age;,char addr30;,a5;,9.3,结构体指针,结构体指针变量,:,如果用一个指针变量指向一个结构体变量,即存储该结构体变量所占据的内存单元的起始地址,则该指针变量称为结构体指针变量。,结构体指针变量也可以用来指向结构体数组中的元素。,9.3.1,结构体指针变量的定义,结构体指针变量的定义形式如下:,结构体类型名 *指针变量名;,例如:,s
11、truct student *p,a;,p=,9.3.2,引用指针所指向的结构体变量的成员,通过指针变量引用结构体变量的成员有如下两种方式:,(,1,),(*,结构体指针,).,成员名,例如:,(*p).num,(,2,)结构体指针,-,成员名,例如:,p-num,9.3.3,指向结构体数组的指针,对于已定义的结构体数组,若用一个变量来存放该结构体数组在内存中的首地址,则该变量为指向结构体数组的指针变量。,例如:,struct student *p,a5;,p=a;,例,9.2,用指向结构体数组的指针处理例,9.1,(按学号顺序整理输出学生情况登记表。),9.4,结构体与函数,1,结构体变量作
12、为函数的形参的三种形式,:,(,1,),以结构体变量的成员作为参数,传递结构体变量的成员的值,。,(,2,),以结构体变量作为参数,直接传递结构体变量的值。,在,ANSI C,标准中允许用结构变量作为函数的参数进行整体传送,即直接将实参结构体变量的各个成员的值逐个传递给形参结构体变量的对应成员。注意,实参与形参必须是相同结构体类型的变量。,(,3,),以结构体指针作为参数,传递结构体变量的地址,。,通过结构体变量的整体传递可以实现函数参数的传递,但这要将结构体变量的全部成员逐个传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。,因此最好的办法就是使用指针,即用指针
13、变量作函数参数进行传送。这时由实参传递给函数形参的只是地址,从而减少了时间和空间的开销。,例,9.3,利用函数完成结构体变量的输入输出。,(阅读书中程序),2,结构体类型作为函数的返回值类型,其一般定义形式:,结构体类型名 函数名,(,形参表,),函数体,例,(,p168),9.4,结构体与函数,9.5,链表,C,语言中,变量存储空间的分配分为静态分配和动态分配两种方式。,(,1,),静态分配方式,:先在程序的声明部分进行定义,然后在程序编译时分配适当的存储单元。这些存储单元一经分配,在它的生存期内是固定不变的。,(,2,),动态分配方式,:在程序执行期间,通过,“,申请,”,分配指定的存储空
14、间来存储数据,当有闲置不用的存储空间时,又可以随时将其释放。,前面章节中处理的变量都是在程序的声明部分定义的变量,在程序编译时分配存储单元,是静态分配方式。本章下面要介绍的是通过动态分配方式,在程序执行期间,通过,“,申请,”,分配的动态的存储单元,以及动态分配的存储单元构成的,“,链表,”,结构。,9.5.1,链表的概念,例,1,:利用,C,语言在计算机中存储三个学生的计算机成绩,如果有定义,int a3,,则其内存单元分配情况如下:,80,a0,75,a1,90,a2,9.5.1,链表的概念,例,2,:用链表存储方式来存储三个同学的计算机成绩。,2002,2036,75,80,90,200
15、2,2058,2058,head,80,head,NULL,75,90,可直观地表示如下:,9.5.2,动态分配函数,1,malloc,函数,函数格式:,void *malloc(unsigned int size),函数功能:在内存的动态存储区中分配一个长度为,size,的存储单元。,例,1,:,int*p;,long*lp;,struct student*head;,p=(int*)malloc(2);,/*,分配一个整型存储单元,(,占用,2,个字节,),用,p,指向该存储单元*,/,lp=(long*)malloc(sizeof(long);,/*,分配一个长整型存储单元,用,lp,指
16、向该存储单元,长整型存储单元所占字节数由函数,sizeof(long),求得*,/,head=(struct student*)malloc(sizeof(struct student);,/*,分配一个,struct student,结构体类型的存储单元,用,head,指向该存储单元*,/,上述函数,sizeof(,类型名,),求出指定类型的存储单元所占字节数,9.5.2,动态分配函数,2,calloc,函数,函数格式:,void calloc(unsigned int n,,,unsigned int size);,函数功能:在内存的动态存储区域中分配,n,个长度为,size,的连续存储单
17、元。形参,n,和,size,均为无符号整数,,n,是连续存储单元的个数,,size,是一个存储单元占用的字节数。函数的返回值为分配的连续存储单元的起始地址;如果分配不成功,则返回值为,0,。,例,2,:,int*p;,p=(int*)calloc(3,sizeof(int);,/*,分配,3,个连续的存储单元,并将其起始地址赋给整型指针变量,p*/,9.5.2,动态分配函数,3,free,函数,函数格式:,void free(void *ptr);,函数功能:释放由指针变量,ptr,指向的内存区域。其中,,ptr,是一个指针变量,指向最近一次调用函数,malloc,或,calloc,时所分配的
18、存储空间的首地址。通过函数,free,将已分配的内存区域交还系统,使系统可以重新对其进行分配。,例,3,:,int*p;,p=(int*)calloc(3,sizeof(int);,free(p);,9.5.3,链表的基本操作,1,链表节点的定义,链表中的任一个节点都包括两个数据项,一个是节点自身的数据信息,称为节点的数据域,另一个是下一节点的地址值,称为节点的指针域。,struct node,datatype data;,struct node *next;,;,datatype,是数据域的类型,可以是前面所介绍的任意,C,语言类型。显然,链表节点的指针域存放的地址类型与它自身的类型是相同的
19、。,例,1,:存储三个同学的计算机成绩的链表存储方式如下:,80,head,NULL,75,90,上述链表中节点的定义如下:,struct node,int data;,struct node *next;,;,链表的头指针定义如下:,struct node *head;,9.5.3,链表的基本操作,2,链表的基本操作,链表的基本操作主要有链表的建立、节点的访问、节点的插入、节点的删除等。,(,1,)链表的建立。,链表的建立是一个动态存储空间分配和形成链接关系的过程。,用尾插法建立链表的过程如下,:,1,)建立一个空链表,即,head=NULL,。,2,)请分配新节点存储单元,对新节点的数据域
20、和指针域赋值。由于新插入的节点总是尾节点,因此,它的指针域的值为空(即,NULL,)。,3,)将新节点链接到链表的尾部:,4,)重复步骤,2,),3,),继续插入新节点直到结束。,例,1,:存储三个同学的计算机成绩的链表存储方式如下:,80,head,NULL,75,90,上述链表中节点的定义如下:,struct node,int data;,struct node *next;,;,链表的头指针定义如下:,struct node *head;,9.5.3,链表的基本操作,例,9.4,用链表存储学生的计算机成绩。,程序段如下:,struct node *creat(),struct node*
21、head,*p,*q;,n=0;,head=NULL;,p=(struct node *)malloc(LEN);,scanf(%d,p-next=NULL;,while(p-data!=-1),n=n+1;,if(n=1)head=p;,else q-next=p;,q=p;,p=(struct node *)malloc(LEN);,scanf(%d,p-next=NULL;,return(head);,#define NULL 0,#define LEN sizeof(struct node),struct node,int data;,struct node *next;,;,int
22、n;,80,head,NULL,75,90,NULL,q,p,(,2,)链表节点的访问。,链表节点的访问过程如下:,1,)取链表头指针,head,。,2,)用一个指针,p,指向链表的第一个节点,即,p=head,。,3,)访问,p,所指节点。,4,)移动指针,p,,使它指向下一节点,即,p=p-next,。,5,)重复步骤,3,)和,4,),直到指针,p,为空。,9.5.3,链表的基本操作,例,9.5,输出例,9.4,建立的链表中所有学生的计算机成绩。,程序段如下:,#define NULL 0,#define LEN sizeof(struct node),struct node,int d
23、ata;,struct node *next;,;,void print(struct node*head),struct node*p;,p=head;,while(p!=NULL),printf(%d,p-data);,p=p-next;,80,head,NULL,75,90,p,p,p,(,3,)链表节点的插入。,其操作过程主要有两个子过程:确定插入位置;插入新节点。,插入条件的要求主要有以下几种情况:,新节点插入在第,i,个节点之前(或后)。,新节点插入在节点数据等于某一指定数据的节点之前(或后)。,新节点插入在一个节点数据有序的链表中,保证插入新节点后链表仍然有序。,下面以新节点插入
24、在节点数据等于某一指定数据的节点之前的情况分例介绍节点插入操作的算法。,操作过程如下:,1,),取链表头指针,head,。,2,)申请分配新节点存储单元,对新节点的数据域赋值。,3,),如果,head,等于,NULL,,即链表为空,不存在指定数据的节点,则新节点插入到链表中,成为链表中惟一的节点,即将新节点的地址赋给头指针,head,,赋新节点指针域的值为,NULL,。,4,),如果,head,不等于,NULL,,用一个指针,p,指向链表的第一个节点,即,p=head,,判断,p,所指节点是否为指定节点,如果不是,移动指针,p,,使它指向它的下一节点,重复判断过程,直到,p,所指节点是指定节点
25、或,p,所指节点的指针域的值为,NULL,。,5,),如果,p,所指节点是指定节点,将新节点插入在,p,所指节点之前,,即,p,的前一节点的指针域的值为新节点的地址,新节点的指针域的值为,p,。,6,),如果,p,所指节点不是指定节点,,但,p,所指节点的指针域的值为,NULL,,则链表中不存在指定数据的节点,新节点插入到链尾,即,p,所指节点之后,赋,p,所指节点的指针域的值为新节点的地址,新节点指针域的值为,NULL,。,7,),返回操作后链表的头指针。,例,9.6,在例,9.4,建立的链表中某一计算机成绩值之前插入一个学生的计算机成绩。,其过程示意图,:,q,80,head,75,x,y
26、,s,p,新结点,指向所搜结点的前驱结点,指向要找的结点,程序段如下:,if(x=p-data),if(p=head),s-next=head;,head=s;,else,s-next=p;,q-next=s;,else ,s-next=p-next;,p-next=s;,return(head);,struct node*insert(struct node*head,int x,int y),struct node*p,*q,*s;,s=(struct node *)malloc(LEN);,s-data=y;,if(head=NULL),s-next=head;,head=s;,retu
27、rn(head);,p=head;,while(p-data!=x&p-next!=NULL),q=p;,p=p-next;,(,4,)链表节点的删除。,链表节点的删除操作同样包括两个子过程:,确定删除节点的位置;删除节点。,下面介绍删除节点数据等于某一指定数据的节点的操作过程。,1,)取链表头指针,head,。,2,)如果,head,等于,NULL,,即链表为空,不存在指定数据的节点,删除操作失败,输出相关信息。,3,)如果,head,不等于,NULL,,用一个指针,p,指向链表的第一个节点,即,p=head,,判断,p,所指节点是否为指定节点,如果不是,移动指针,p,,使它指向它的下一节点
28、,重复判断过程,直到,p,所指节点是指定节点或,p,所指节点的指针域的值为,NULL,。,4,)如果,p,所指节点是指定节点,删除该节点,即,p,所指节点指针域的值赋给其前一节点的指针域。,5,)如果,p,所指节点不是指定节点,但,p,所指节点的指针域的值为,NULL,,则链表中不存在指定数据的节点,删除操作失败,输出相关信息。,6,)返回操作后链表的头指针。,9.5.3,链表的基本操作,例,9.7,在例,9.4,建立的链表中删除某一指定计算机成绩的节点。,q,80,head,x,80,p,指向要删除结点,指向要删除结点前驱结点,9.5.3,链表的基本操作,程序段如下:,#define NUL
29、L 0,#define LEN sizeof(struct node),struct node,int data;,struct node *next;,;,struct node*del(struct node*head,int x),struct node*p,*q;,if(head=NULL),printf(,该链表是空表。,);,return(head);,p=head;,while(p-data!=x&p-next!=NULL),q=p;,p=p-next;,if(x=p-data),if(p=head)head=p-next;,else q-next=p-next;,else pr
30、intf(,找不到该节点。,);,return(head);,9.6.1,共用体类型的定义,其一般形式为:,union,标识符,类型名,1,成员名,1;,类型名,2,成员名,2;,类型名,n,成员名,n;,;,说明:,(,1,),union,是关键字,是共用体类型的标志。,(,2,)标识符是共用体名,是用户自己定义的标识符,与关键字,union,共同构成共用体类型名。,(,3,)花括号,“,”,中是组成该共用体类型的成员数据项,或称为共用体中的分量,由成员类型和成员名组成。,(,4,)共用体成员的数据类型可以是简单类型、数组、指针或结构等。,(,5,)共用体类型的长度是共用体成员中的最大长度。
31、,9.6.1,共用体类型的定义,例如:如果有定义:,union xy,char ch;,int a3;,float b;,);,共用体类型,union xy,的存储单元中各成员占用空间情况如图:,则共用体类型,union xy,的长度是,6,(占用内存的字节数)。,ch,a0,a1,a2,b,9.6.2,共用体变量的定义,共用体变量定义的一般形式:,共用体类型名 变量名表,;,共用体变量的定义有如下三种处理方式:,(,1,)先定义共用体类型,再定义共用体变量。,例,1,:,union xy,char ch;,int a3;,float b;,;/*,定义共用体类型,union xy*/,uni
32、on xy x,y;,/*,定义,x,、,y,为共用体类型,union xy,的变量*,/,9.6.2,共用体变量的定义,(,2,)在定义共用体类型的同时定义共用体变量。,例,2,:,union xy,char ch;,int a3;,float b;,x,y;,(,3,)直接定义共用类型变量。,例,3,:,union,char ch;,int a3;,float b;,x,y;,9.6.3,共用体变量的引用,引用形式如下:,共用体变量名,.,成员名,例如:,union xy,char ch;,int a3;,float b;,x,y;,x.ch=m;,y.a0=20;,说明:,(,1,)对同
33、一共用体的不同成员进行赋值后,共用体变量中存储的是最后一次成员的赋值。,(,2,)不能直接使用共用体变量名进行输入输出。,(,3,)可以直接使用共用体变量名对一个同类型的共用体变量赋值。,(,4,)共用体变量名可以作为函数参数。,(,5,)不能对共用体变量进行初始化。,(,6,)可以定义共用体类型的数组。,(,7,)可以定义共用体类型的指针,也可以使用共用体类型的指针作函数参数。引用指针指向共用体的成员同样使用运算符,“,-,”,9.7,枚举,所谓枚举,是将具有相同属性的一类数据值一一列举。枚举是一个已命名的一组常量的集合。,例如:表示星期的(标识符常量),Sunday,,,Monday,,,
34、Tuesday,,,Wednesday,,,Thursday,,,Friday,,,Saturday,就是一个枚举。,枚举是,C,语言中的简单类型而非构造类型,它的值域是有穷的,可以一一列举出来,变量的取值只限于列举出来的值的范围。,9.7.1,枚举类型的定义,其形式为:,enum,枚举名,标识符,1=,整型常数,标识符,2=,整型常数,标识符,n=,整型常数,;,说明:,(,1,),enum,是关键字,是枚举类型的标志。,(,2,)标识符是枚举名,是用户自己定义的标识符,与关键字,enum,共同构成枚举类型名。,(,3,)花括号,“,”,中的,“,标识符,1,标识符,2,标识符,n,”,是所
35、定义枚举类型的全部取值,通常将这些标识符称为,“,枚举元素,”,或,“,枚举常量,”,。这些标识符是用户定义的标识符,一般是所代表事物的名称。,(,4,)枚举中每个标识符后的结束符是,“,”,,而不是,“,;,”,,最后一个标识符后可省略,“,”,。,(,5,)如果枚举没有初始化,即省掉,“,=,整型常数,”,时,则从第一个标识符开始,顺次赋给标识符整型常数,0,,,1,,,2,,,。但当枚举中的某个标识符被赋值后(可以赋负数),其后的标识符按依次加,1,的规则确定其值。,9.7.1,枚举类型的定义,例如:,enum weekday,Sunday,Monday,Tuesday,Wednesda
36、y,Thursday,Friday,Saturday,;,9.7.2,枚举变量的定义,枚举变量定义的一般形式:,枚举类型名 变量名表,;,枚举变量的定义有如下三种处理方式:,(,1,)先定义枚举类型,再定义枚举变量。,例,1,:,enum weekday,Sunday,Monday,Tuesday,Wedneday,Thursday,Friday,Saturday,;/*,定义枚举类型,enum weekday*/,enum weekday x,y;,/*,定义,xy,为枚举类型,enum weekday,的变量*,/,9.7.2,枚举变量的定义,(,2,)在定义枚举类型的同时定义枚举变量。,
37、例,2,:,enum weekday,Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,x,y;,(,3,)直接定义枚举类型变量。,例,3,:,enum,Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,x,y;,9.7.3,枚举变量的应用,(,1,)枚举变量取枚举说明结构中的某个标识符常量后,其值可认为是标识符对应的常数。,例,1,:,enum weekday,Sunday=0,Monday,Tuesday,Wedneday,Thursday,Friday,Satu
38、rday,x,y;,x=Friday;,y=Tuesday,;,即,x,的值为,5,,,y,的值为,2,。,9.7.3,枚举变量的应用,(,2,)不能直接给一个枚举变量赋一个整数,但经过强制类型转换后可以实现赋值。,例,2,:,x=5;,是不合法的。,x=(enum weekday)5;,是合法的,(,3,)枚举变量的值不能直接输入输出,一般通过下面例,3,的方式实现。,例,3,:,enum weekday,Sunday=0,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,x;,int n;,scanf(%d,&n),switch(n),ca
39、se 0:x=Sunday;,case 1:x=Monday;,case 2:x=Tuesday;,case 3:x=Wednesday;,case 4:x=Thursday;,case 5:x=Friday;,case 6:x=Saturday;,switch(x),case Sunday:printf(Sunday);,case Monday:printf(Monday);,case Tuesday:printf(Tuesday);,case Wednesday:printf(Wednesday);,case Thursday:printf(Thursday);,case Friday:p
40、rintf(Friday);,case Saturday:printf(Saturday);,枚举变量输入,枚举变量输出,9.7.3,枚举变量的应用,(,4,)枚举值可以进行比较。,例,4,:,enum weekday,Sunday=0,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,x;,if(x=Friday)printf(,今天是周末,!);,if(x Sunday)printf(,今天要工作!,);,9.8,自定义类型,自定义类型是将一个数据类型定义一个新的名字。,自定义类型的格式为:,typedef,类型名 标识符,;,例如:,ty
41、pedef int IN;/*,定义整型,int,的新类型名为,IN*/,IN x;/*,定义,IN,类型(即,int,)的变量,x*/,typedef struct student,char name8;,int class;,char subclass6;,float math,phys,chem,engl,biol;,ST;/*,定义,struct student,的新类型名为,ST*/,ST y,;,/*,定义,ST,类型(即,struct student,)的变量,y*/,9.10,典型试题详解,1,设有如下说明语句:,struct ex,int x;float y;char z;e
42、xample;,则下面的叙述中不正确的是,_,。,A,),struct,是结构体类型的关键字,B,),example,是结构体类型名,C,),x,、,y,、,z,都是结构体成员名,D,),struct ex,是结构体类型,正确答案:,B,(知识点:结构体类型及结构体变量的定义),试题分析:,example,是结构体类型的变量名。,9.10,典型试题详解,2,设有如下定义:,struct ss,char name10;,int age;,char sex;,std3,*p=std;,下面各输入语句中错误的是,_,。,A,),scanf(,%d,B,),scanf(,%s,C,),scanf(,%
43、c,D,),scanf(,%c,正确答案:,B,(知识点:结构体数组、指向结构体数组的指针、结构体变量的引用),9.10,典型试题详解,3,设有如下定义:,struct sk,int a;,float b;,data;,int*p;,若要使,p,指向,data,中的,a,域,正确的赋值语句是,_,。,A,),p=&aB,),p=data.a;C,),p=&data.aD,)*,p=data.a,正确答案:,C,(知识点:结构体成员地址的引用、指向结构体成员的指针),9.10,典型试题详解,4,以下选项中不能正确把,c1,定义成结构体变量的是,_,。,A,),typedef struct B,)
44、,struct color c1,int red;int red;,int green;int green;,int blue;COLOR int blue;,COLOR c1;,C,),struct colorD,),struct,int red;int n;,int green;int green;,int blue;c1;int blue;c1;,正确答案:,B,(知识点:结构体变量的定义、自定义变量),9.10,典型试题详解,5,有以下程序:,struct s,int x,y;,data2=10,100,20,200;,main(),struct s*p=data;,printf(,%
45、dn,+(p-x);,程序运行后的输出结果是,_,。,正确答案:,11,(知识点:结构体数组、指向结构体数组的指针),9.10,典型试题详解,6,假定建立了以下链表结构,指针,p,、,q,分别指向如下图所示的节点,则以下可以将,q,所指节点从链表中删除并释放该节点的语句组是,_,。,8,3,4,p,q,head,data,next,A,),free(q);p-next=q-next;,B,),(*p).next=(*q).next;free(q);,C,),q=(*q).next;(*p).next=q;free(q);,D,),q=q-next;p-next=q;p=p-next;free(
46、q);,正确答案:,B,(知识点:链表的基本操作),9.10,典型试题详解,7,有以下结构体说明和变量的定义,且如下图所示指针,p,指向变量,a,,指针,q,指向变量,b,,则不能把节点,b,连接到节点,a,之后的语句是,_,。,struct node,char data;,struct node*next;,a,b,*p=,data,next,p,a,data,next,q,b,A,),a.next=q;B,),p.next=,C,),p-next=D,),(*p).next=q;,正确答案:,B,(知识点:链表的基本操作),9.10,典型试题详解,8,以下程序的输出结果是,_,。,main
47、(),union,char i2;,int k;,r;,r.i0=2;,r.i1=0;,printf(%dn,r.k);,正确答案:,2,(知识点:共用体类型),ch0,ch1,k,r,2,0,9.10,典型试题详解,9,有以下定义和语句,则,sizeof(a),的值是,_,,而,sizeof(a.share),的值是,_,。,struct date,int day;,int month;,int year;,union int share1;,float share2;,share;,a;,正确答案:,10 4,(知识点:共用体类型、结构体类型、,sizeof,函数),9.10,典型试题详解,10,若要说明一个类型名,STP,,使得定义语句,STP s;,等价于,char*s;,,以下选项中正确的是,_,。,A,),typedef STP char*sB,),typedef*char STP,C,),typedef STP*charD,),typedef char*STP,正确答案:,D,(知识点:自定义类型),试题分析:要使得定义语句,STP s;,等价于,char*s;,,则,STP,等价于,char*,,使用自定义类型进行类型名处理为:,typedef char*STP,。,