题目详情

阅读以下说明和C程序,填充函数中的空缺,将解答填入答题纸的对应栏内。

【说明】

N个游戏者围成一圈,从1~N顺序编号,游戏方式如下:从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,直到剩余一个游戏者为止,该游戏者即为获胜者。

下面的函数playing(LinkList head)模拟上述游戏过程并返回获胜者的编号。其中,N个人围成的圈用一个包含N个结点的单循环链表来表示,如图4-1所示,游戏者的编号放在结点的数据域中。

初级程序员,章节练习,基础复习,案例分析

在函数中,以删除结点来模拟游戏者退出圈子的处理。整型变量c(初值为1)用于计数,指针变量p的初始值为head(如图4-1所示)。游戏时,从p所指向的结点开始计数,p沿链表中的指针方向遍历结点,c的值随p的移动相应地递增。当c计数到2时,就删除p所指结点的下一个结点(因下一个结点就表示报数到3的游戏者),如图4-2所示,然后将c设置为0后继续游戏过程。

初级程序员,章节练习,基础复习,案例分析

结点类型定义如下:

typedef struct node{

int code; /*游戏者的编号*/

struct node *next;

}NODE,*LinkList;

【C 函数】

int playing(LinkList head ,int n)

{ /* head 指向含有n个结点的循环单链表的第一个结点(即编号为1的游戏者) */

LinkList p = head ,q;

int theWinner ,c = 1;

while ( n > (1) ){

if (c == 2) { /*当c等于2时,p所指向结点的后继即为将被删除的结点*/

q = p->next;

p->next = (2) ;

printf("%d\t" ,q->code); /*输出退出圈子的游戏者编号时*/

free (q) ;

c = (3) ;

n--;

} /*if*/

p = (4) ;

c++;

}/*while*/

theWinner= (5) ;

free(p);

return theWinner; /*返回最后一个游戏者(即获胜者)的编号*/

}

正确答案及解析

正确答案
解析

(1) 1

(2) q->next 或 p->next->next

(3) 0

(4) p->next

(5) p->code

本题考查数据结构的应用和C程序的运算逻辑,主要涉及指针和链表。 由于游戏最后剩一人时结束,因此空(1)处应填入"1",表示N>1时游戏过程要继续。

当c等于2时,p所指结点的后继表示为q(q = p->next),q所指结点即为要删除的结点,即如下图所示。

初级程序员,章节练习,初级程序员真题卷

此时,需要修改p所指结点的指针域,令其指向q所指结点的后继结点,对应的操作为p->next=q->next(等同于p->next = p->next->next) ,因此空(2)处应填入"q->next" 或 "p->next->next"。将q所示结点删除后的相关指针如下图所示。

初级程序员,章节练习,初级程序员真题卷

题目中已经说明,完成结点的删除后将c的值置为0,因此空(3)处应填入"0",为开始下次报数做好准备。由于下次应从上图中的x+2所在结点从1开始报数,因此空(4)处应填入"p->next",以令p指向上图中的x+2所在结点。空(5)处应填入"p->code"。

你可能感兴趣的试题

单选题

中级软件设计师,章节练习,中级软件设计师系统开发运行知识

  • A.0
  • B.1
  • C.2
  • D.3
查看答案
单选题

中级软件设计师,章节练习,中级软件设计师系统开发运行知识

  • A.1、1
  • B.1、2
  • C.2、2
  • D.2、3
查看答案
单选题

中级软件设计师,章节练习,中级软件设计师系统开发运行知识

  • A.3
  • B.4
  • C.5
  • D.6
查看答案
单选题

中级软件设计师,章节练习,中级软件设计师系统开发运行知识

中级软件设计师,章节练习,中级软件设计师系统开发运行知识

  • A.V(S3)和V(S5)V(S6)
  • B.P(S3)和V(S5)V(S6)
  • C.V(S3)和P(S5)P(S6)
  • D.P(S3)和P(S5)P(S6)
查看答案
单选题

中级软件设计师,章节练习,中级软件设计师系统开发运行知识

  • A.243ms
  • B.246ms
  • C.254ms
  • D.280ms
查看答案

相关题库更多 +