结构体和联合体例题.docx
《结构体和联合体例题.docx》由会员分享,可在线阅读,更多相关《结构体和联合体例题.docx(16页珍藏版)》请在冰豆网上搜索。
结构体和联合体例题
第11章结构体与联合体例题
例11-1.以下叙述中错误的是()。
2007.9
A)用typedef可以增加新类型√
B)typedef只是将已存在的类型用一个新的名字来代表
C)用typedef可以为各种类型说明一个新名,但不能用来为变量说明一个新名
D)用typedef为类型说明一个新名,通常可以增加程序的可读性
例11-2设有以下说明:
typedefstructST
{
lonta;
intb;
charc[2];
}NEW;
则下面叙述中正确的是()。
2005.4
A)以下说明形式非法B)ST是一个结构体类型
C)NEW是一个结构体类型√D)NEW是一个结构体变量
例11-3.有以下程序段:
typedefstructnode
{
intdata;
structnode*next;
}*NODE;
NOEp;
以下叙述中正确的是()。
2007.4
A)p是指向structnode结构变量的指针的指针B)NODEp;语句出错
C)p是指向structnode结构变量的指针√D)p是structnode结构变量
例11-4.设有说明:
structDATA{intyear;intmonth;intday;};
请写出一条定义语句,该语句定义d为上述结构体变量,并同时为其成员year、month、day依次赋值为2006、10、1:
。
(2007.4)
例11-5.以下程序运行后的输出结果是()(2005.9)
#include
structSTU
{
intnum;
floatTotalScore;
};
voidf(structSTUp)
{
structSTUs[2]={{20044,550},{20045,537}};
p.num=s[1].num;
p.TotalScore=s[1].TotalScore;
}
main()
{
structSTUs[2]={20041,703},{20042,580}};
f(s[0]);
printf("%d%3.0f\n",s[0].num,s[0].TotalScore);
}
程序运行后的输出结果是()。
(2005.9)
A)20045537B)20044550C)20042580D)20041703
例11-6.有以下程序:
#include
#include
typedefstruct
{
charname[9];
charsex;
floatscore[2];
}STU;
STUf(STUa)
{
STUb={"Zhao",'m',85.0,90.0};
inti;
strcpy(a.name,b.name);
a.sex=b.sex;
for(i=0;i<2;i++)
a.score[i]=b.score[i];
returna;
}
main()
{
STUc={"Qian",'f',95.0,92.0},d;
d=f(c);
printf("%s,%d,%2.0f,%2.0f\n",d.name,d.sex,d.Score[0],d.score[1]);
}
程序的运行结果是()。
(2007.9)
A)Qian,f,95,92B)Qian,m,85,90C)Zhao,m,85,90D)Zhao,f,95,92
例11-7.以下程序运行后的输出结果是()。
2005.9
#include
srtructSTU
{
charname[10];
intnum;
};
voidf(char*name,intnum)
{
structSTUs[2]={{"SunDan",20044},{"PengHua",20045}};
num=s[0].num;
strcpy(name,s[0].name);
}
main()
{
structSTUs[2]={{"YanhSan",20041},{"LiSiGuo",20042}},*p;
p=&s[1];
f(p->name,p->num);
printf("%s%d\n",p->name,p->num);
}
A)SunDan20042√B)SunDan20044C)LiSiGuo20042D)YangSan20041
例11-8.以下程序运行后的输出结果是()。
2007.4
#include
typedefstruct{intb,p;}A;
voidf(Ac)//注意:
c是结构体变量名
{intj;
c.b=1;
c.p=2;
}
main()
{inti;
Aa={1,2};
f(a);
printf("%d,%d\n",a.b,a.p);
}
A)2,3B)2,4C)1,4D)1,2√
例11-9.以下程序运行后的输出结果是()。
2007.4
#include
structS{intn;inta[20];};
voidf(structS*p)
{inti,j,t;
for(i=0;in-1;i++)
for(j=i+1;jn;j++)
if(p->a[i]>p->a[j])
{t=p->a[i];
p->a[i]=p->a[j];
p->a[j]=t;
}
}
main()
{inti;
structSs={10,{2,3,1,6,8,7,5,4,10,9}};
f(&s);
for(i=0;iprintf("%d",s.a[i]);
}
A)1,2,3,4,5,6,7,8,9,10,√B)10,9,8,7,6,5,4,3,2,1,
C)2,3,1,6,8,7,5,4,10,9,D)10,9,8,7,6,1,2,3,4,5,
例11-10.以下结构体说明和变量定义如图所示。
structnode
{
intdata;
structnode*next;
}*p,*q,*r;
现要将q所指节点从链表中删除,同时要保持链表的结构,以下不能完成指定存在的语句是()。
A)p->next=q->next;B)p->next=p->next->next;
C)p->next=r;D)p=q->next;√
例11-11.以下程序运行后的输出结果是()。
(2005.9)
#defineNULL0
structNODE
{intnum;
structNODE*next;
}
main()
{structNODEs[3]={{1,NULL},{2,NULL},{3,NULL}},*p,*q,*r;
intsum=0;
s[0].next=s+1;
s[1].next=s+2;
s[2].next=s;
p=s;
q=p->next;
r=q->next;
sum+=q->next->num;
sum+=r->next->next->num;
printf("%d\n",sum);
}
答案:
5
例11-12.以下程序运行后的输出结果是()。
(2007.9)
#include
structtt
{intx;
structtt*y;
}*p;
structtta[4]={20,a+1,15,a+2,30,a+3,17,a};
main()
{inti;
p=a;
for(i=1;i<=2;i++)
{
printf("%d,",p->x);
p=p->y;
}
}
A)20,30B)30,17C)15,30D)20,15√
例11-13.若有以下说明和定义:
uniondt
{inta;
charb;
doublec;
}data;
以下叙述中错误的是()。
(2005.4)
A)data的每个成员起始地址都相同
B)变量data所占的内存字节数与成员c所占字节数相等
C)程序段:
data.a=5;printf(“%f\n”,data.c);输出结果为5.000000
D)data可以作为函数的实参
例11-14.设有以下定义:
uniondata
{intd1;
floatd2;
}demo;
下面叙述中错误的是()。
(2007.9)
A)变量demo与成员d2所占的内存字节数相同
B)变量demo中各成员的地址相同
C)变量demo和个成员的地址相同
D)若给demo.d1赋99后,demo.d2中的值是99.0√
例11-14.在说明一个结构体变量时相同分配给它的存储空间是()。
A)该结构体中第一个成员所需的存储空间
B)该结构体中最后一个成员所需的存储空间
C)该结构体中占用最大存储空间的成员所需的存储空间
D)该结构体中所有成员所需存储空间的总和
例11-15在说明一个共用体变量时相同分配给它的存储空间是()。
A)该共用体中第一个成员所需的存储空间
B)该共用体中最后一个成员所需的存储空间
C)该共用体中占用最大存储空间的成员所需的存储空间
D)该共用体中所有成员所需存储空间的总和
例11-16以下关于typedif的叙述不正确的是()。
A)用typedef可以定义各种类型名,但不能用来定义变量
B)用typedef可以增加新类型√
C)用typedef只是将已存在的类型用一个新的名字来代表
D)使用typedef语句不能创建新的类型,只是给定义的类型取一个新名字。
例11-17以下关于枚举的叙述不正确的是()。
A)枚举变量只能取对应枚举类型的枚举元素表中的元素
B)可以在定义枚举类型时对枚举元素进行初始化
C)枚举元素表中的元素有先后次序,可以进行比较
D)枚举元素的值可以是数字或字符串√
例11-18正确的k值是()。
enum{a,b=5,c,d=4,e}k;
k=e;
A)3B)4C)5D)6
例11-19正确的k值是()。
enum{a,b=5,c,d=4,e}k;
k=a;
A)0B)4C)1D)6
例11-20以下对结构体变量stu1中成员age的非法引用是()。
structstudent
{intage;
intnum;
}stu1,*p;
p=&stu1;
A)stu1.ageB)student.ageC)p->ageD)(*p).age
例11-21有以下定义:
structdate
{intyear,month,day;};
structwoklist
{charname[20];
charsex;
structdatebirthday;
}person;
对结构体变量person的出生年份进行赋值时,下面正确的赋值语句是()。
A)year=1988;B)birthday.year=1988;
C)person.birthday.year=1988;D)person.year=1988;
例11-22若有以下说明和语句,则表达式()的值为101。
structwe
{inta;
int*b;
}*p;
intx0[]={11,12},x1[]={31,32};
staticstructwex[2]={100,x0,300,x1};
p=x;
A)*p->bB)p->aC)++p->aD)(p++)->a
例11-23设有以下说明,则下面不正确的叙述是()。
uniondata
{
inti;
charc;
floatf;
}a;
A)a所占的内存长度等于成员f的长度
B)a的地址和它的成员地址都是同一地址
C)a可以作为函数参数
D)不能对a赋值,但可以在定义a时对它初始化
解共用体不能作为函数参数(但共用体变量指针可以作为函数参数),所以本体答案C。
二、填空题:
例11-24下列程序的运行结果是。
#include
structs
{
intn;
int*m;
}*p;
intd[5]={30,10,40,20,50};
structsarr[5]={300,&d[0],100,&d[1],400,&d[2],200,&d[3],500,&d[4]};
main()
{p=arr;
printf("%d,",++p->n);
printf("%d,",(++p)->n);
printf("%d\n",++(*p->m));
}
答案:
301,100,11
例11-25以下程序的运行结果是。
#include
typedefunion
{
longi;
intk[5];
charc;
}DATE;
structdate
{
intcat;
DATEcow;
doubledog;
}too;
DATEmax;
main()
{
printf("%d\n",sizeof(structdate)+sizeof(max));
}
答案52(VC++)
例11-26以下程序的运行结果是。
#include
structst
{
intx;
int*y;
}*p;
ints[]={10,20,30,40};
structsta[]={1,&s[0],2,&s[1],3,&s[2],4,&s[3]};
main()
{
p=a;
printf("%d,",p->x);
printf("%d,",(++p)->x);
printf("%d,",*(++p)->y);
printf("%d\n",++(*(++p)->y));
}
答案:
1,2,30,41
例11-27;有以下定义:
struct
{
intx;
int*y;
}tab[2]={{1,"ab"},{2,"cd"}},*p=tab;
则表达式*p->y的结果是;表达式*(++p)->y的结果是.
答案:
‘a’,‘c’
例11-28有如下定义:
struct
{
intx;
inty;
}s[2]={{1,2},{3,4}},*p=s;
则表达式++p->x的结果是;表达式(++p)->x的结果是。
答案23
例11-29以下函数creat()用来建立一个带头节点的单链表,新产生的节点总是插在链表的末尾,单链表的头指针为函数值返回。
请填空。
#include
structlist
{
chardata;
structlist*next;
};
structlistcreat()
{
structlist*h,*p,*q;
charch;
h=①malloc(sizeof(②));/*建立头节点*/
p=q=h;/*p,q指向头节点*/
while(ch!
='?
')/*输入非‘?
‘循环*/
{
p=③malloc(sizeof(④));/*建立要插入的节点*/
q->data=ch;
q->next=p;/*将节点*p插在*q之后*/
q=p;/**q始终指向新健链表的最后节点*/
ch=getchar();
}
p->next='\0';/*将最后节点next域置空*/
⑤;/*返回头节点指针*/
}
答案:
①(structlist*);②structlist③(structlist*)
④structlist⑤return(h)
例11-30以下min()函数的功能是:
查找带有头结点的单链表中节点数据域的最小值作为函数值返回。
请填空。
structnode
{
intdata;
structnode*next;
};
intmin(structnode*fist)
{
structnode*p;
intm;
p=first->next;
m=p->data;
for(p=p->next;p!
='\0';p=①;
if(②)m=p->data;
returnm;
}
答案:
①p->next②p->data