结构体(3)

 

19.有以下结构体说明,变量定义和赋值语句

struct STD

{ char name[10];

int age;

char sex;

}s[5],*ps;

ps=&s[0];

则以下scanf函数调用语句中错误引用结构体变量成员的是

A)scanf(”%s”,s[0].name); B)scanf(“%d”,&s[0].age);

C)scanf(“%c”,&(ps->sex)); D)scanf(“%d”,ps->age);

【答案】D

【解析】本题考查scanf()的函数的运用。在scanf()函数中,除了第1个参数为“格式控制”字符串外,其余参数均为地址值。因此,选项B和C都是合法的。选项A中的S[0].name是数组名,是一个地址值,所以也合法。而选项D中的ps一>age是通过结构体指针ps引用其所指内容的成员age,该成员为int型变量不是地址值,故不合法。应该选择D。

20.若有以下定义和语句

union data

{ int i; char c; float f;} x;

int y;

则以下语句正确的是

A)x=10.5;

C)y=x;

【答案】B

【解析】本题考查了共用体的运用。共用体变量和结构体变量不能直接参与一般的运算,而只能通过“一>”和“.”运算符取其成员变量来参与运算。因此,选项A)C和D都是错误的。故应该选择B。

21.程序中已构成如下图所示的不带头结点的单向链表结构,指针变量s,p,q均已正确定义,并用于指向链表结点,指针变量s总是作为头指针指向链表的第一个结点。 B)x.c=101; D)printf(“%d\n”,x);


若有以下程序段

q=s; s=s->next; p=s;

while(p->next) p=p->next;

p->next=q; q->next=NULL;

该程序段实现的功能是

A)首结点成为尾结点 B)尾结点成为首结点

C)删除首结点

【答案】A

【解析】刚开始时s指向a结点(链表头),所以语句q=s;使q也指向a结点。S=s一>next;语句使s指向a的下一个结点b。p=s;语句使p也指向b结点。接下来是一个while循环,循环条件为p一>next ,即当p没有指向链表尾时执行循环体p=p一>next;让p指向下一个结点,所以当循环结束时,p指向链表尾(c结点)。执行到此时,s、p、q分别指向的结点是B)C)a。然后执行p一>next=q;,使c结点的后续指针指向了a结点。最后执行q一>next=NULL;,使a结点的后续指针为NULL。由此可见,该程序段实现了将a结点移动到c结点之后.即首结点成为尾结点。故应该选择A。

22.有以下程序

struct S {int n; int a[20];};

void f(struct S *p)

{ int i,j,t;

for(i=0;i n-1;i++)

for(j=i+1;j n;j++)

if(p->a[i]>p->a[j]) { t=p->a[i]; p->a[i]=p->a[j]; p->a[j]=t; }

}

main( )

{ int i; struct S s={10,{2,3,1,6,8,7,5,4,10,9}};

?SPAN lang=EN-US> f(&s);

for(i=0;i<s.n;i++) printf("%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,

【答案】A

【解析】本题主要考查了选择排序算法和结构体指针用作函数参数。选择排序一般使用一个二重循环,外循环从待排序第1个元素遍历到倒数第2个元素,内循环从外循环变量所指元素的后一个元素遍历到最后一个元素。然后在D)删除尾结点


内循环的循环体中,比较外循环变量所指元素和内循环变量所指元素的大小,两者若为逆序(若从大到小排序,则前者小于后者为逆序;从小到大则前者大于后者为逆序),则交换两者内容。题目的f()函数中,外循环从0递增到p->n-2,内循环从i+l递增到p->n-1,内循环体中if语句条件是“p->a[i]>p->a[j]”,即前者大于后者则执行if子句(变换两者)。这些都满足选择排序算法,又因为指针用于函数参数传递的都是地址值,无论指针类型是结构体还是其他什么类型,即函数f()可以改变实参的内容。因此可以断定f()函数的作用就是:将传入参数所指结构体中的数组成员a的前n位(n也是结构体成员)进行从小到大排序。故本题应该选择A。

23. 有以下程序

struct S{ int n; int a[20]; };

void f(int *a,int n)

{int i;

for(i=0;i<n-1;i++) a[i]+=i;

}

main( )

{ int i; struct S s={10,{2,3,1,6,8,7,5,4,10,9}};

f(s.a,s.n);

for(i=0;i<s.n;i++) printf("%d",s.a[i]);

}

程序运行后的输出结果是( )

A)2,4,3,9,12,12,11,11,18,9, B)3,4,2,7,9,8,6,5,11,10,

C)2,3,1,6,8,7,5,4,10,9, D)1,2,3,6,8,7,5,4,10,9,

【答案】A

【解析】首先分析题目中的f()函数,函数中只有一个for循环,循环了参数n-1次,每次循环令指针参数a所指数组中对应的元素自增循环变量i,即循环结束时让a[0]+=0、a[l]+=1、a[2]+=2??。主函数中,首先定义了一个结构体s,并初始化为{lO,{2,3,l,6,8,7,5,4,10,9}}。然后,使用该结构体的两个成员为参数调用函数f().由此可见,调用的结果会令结构体s的数组成员a的元素a[0]~a[8]分别自增0~8,即函数返回时,s中的内容应该为{10,{2+0,3+1,1+2,6+3,8+4,7+5,5+6,4+7,10+8,9}}={10,{2,4,3,9,12,12,1l,1l,18,9}}。故本题应该选择A。

24. 有以下程序段

typedef struct node { int data; struct node *next; } *NODE;

NODE p;

以下叙述正确的是( )

A)p是指向struct node结构变量的指针的指针

B)NODE p;语句出错

C)p是指向struct node结构变量的指针

D)p是struct node结构变量

【答案】C

【解析】本题考查了typedef关键字的用法。使用关键字typedef可以为已有类型名定义一个新类型名。其语法格


式为:

typedef<已有类型名><新类型名>

typedef类型说明并没有真正地定义新的数据类型,它只是相当于给某个已有的数据类型起了一个别名。本题的typedef语句中,“struct node{int data;struct node*next;}*”就是<已有类型名>,给这个已有类型所起的别名就是NODE。所以,下面的定义语句可以将NODE用“struct node{int data;struct node *next;}”替换掉,即完整的定义语句是“struct node{int data;struct node *next;}*p;”。由此可见,P是指向struct node结构变量的指针,故应该选择C。

25.有以下说明和定义语句

struct student

{ int age; char num[8];};

struct student stu[3]={{20,"200401"},{21,"200402"},{10\9,"200403"}};

struct student *p=stu;

以下选项中引用结构体变量成员的表达式错误的是

A) (p++)->num B)p->num C)(*p).num D)stu[3].age

【答案】D

【解析】本题考核的知识点是结构体数组元素成员的引用。结构体变量也有地址,因此可以把它的地址赋值给一个指针变量,然后通过该指针变量来引用结构体的成员,选项A和选项B就是通过指针变量来引用结构体的成员,故选项A和选项B都正确,也可以通过结构体数组元素的成员引用,选项C和选项D属于这种情况,而在选项D中stu[3].age不正确,因为结构体数组stu共有三个元素,其下标应该为0、l、2。所以,4个选项中选项D符合题意。

26.现有以下结构体说明和变量定义,如图所示,指针p、q、r分别指向一个链表中连续的三个结点。

struct node

{ char data; struct node *next;

}*p,*q,*r;

现要将q和r所指结点交换前后位置,同时要保持链表的连续,以下不能完成此操作的语句是

A)q->next=r->next;p->next=r;r->next=q;

B)p->next=r;q->next=r->next;r->next=q;

C)q->next=r->next;r->next=q;p->next=r;

D)r->next=q;p->next=r;q->next=r->next;

【答案】D

【解析】本题考查的是指针的应用。解本题的关键是理解题目中的要求“将q和r所

指结点交换前后位置,同时要保持链表的连续”。我们不妨先想想交换后的样子,应

该是像下面这个样子:


data next data next data next

??

↑p ↑r ↑q

然后比较一下交换前的样子,我们会发现,其中需要改变的指针只有3个:

(1)结点A的next指针从原来指向结点B变为指向结点C:

(2)结点C的next指针从原来指向结点C的后续结点变为指向结点B:

(3)结点B的next指针从原来指向结点c变为指向结点c的后续结点。在选项A中,语句q一>next=r一>next;实现了改变(3);p一>next=r;实现了改变(1);r>next=q;实现了改变(2)。所以选项A能够完成题目要求的操作,同样可以推出选项B和c也能够完成题目要求的操作,只不过操作的顺序不一样而已。而在选项D中,r->next=q;实现了改变(2):p->next=r;实现了改变(1);但q->next=r->next;已经无法实现改变(3)了,因为在执行第1条语句r->next=q;时,r->next已经指向了结点B,从而丢失了结点c的后续结点的位置。所以我们无论如何要在改变(2)之前实现改变(3),否则无法实现题目的要求,故应该选择D。

27.有以下程序段

struct st

{ int x; int *y;}*pt;

int a[]={1,2},b[]={3,4};

struct st c[2]={10,a,20,b};

pt=c;

以下选项中表达式的值为11的是

A)*pt->y B)pt->x

【答案】C

【解析】本题考查的是*、一>和++运算符的混合运算。要计算一个复杂的表达式时,首先要弄明白表达式中所有运算符的优先级与结合性,本题中所涉及的运算符中,一>的优先级最高,*和++的优先级相同,但其结合性为从右至左。所以选项A等价于*(pt一>y)也就是pt所指向的结构体的成员指针变量y所指向的内容。从前面的程序段不难看出,pt指向结构体数组c的首地址,也就是指向它的第1个元素,在它的第1个元素中,指针变量y又被初始化为指向整型数组a的首地址,即指向数组a的第1个元素。故选项A中的表达式的值为a[O],也就是1。选项B中表达式的值就是c[0].x,即10。根据优先级和结合性,选项C中的表达式等价于++(pt一>x),由于是前缀++,所以整个表达式的值为pt一>x的值加1.故为ll。而选项D中,++是后缀形式,所以(pt++)的值还是pt的原值,即等于pt一>x的值

bbs.99jianzhu.com内容:建筑图纸、PDF/word 流程,表格,案例,最新,施工方案、工程书籍、建筑论文、合同表格、标准规范、CAD图纸等内容。


TOP最近更新内容

    江苏省盱眙县都梁中学高中数学第2章平面向
    绿豆蛋花是怎样制作及具有什么样的功效?
  • 上一篇:施工现场临时厕所保洁制度
  • 下一篇:HACTL_Superterminal__Foster_Partners.pdf