阅读以下说明和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"。
你可能感兴趣的试题
一台主机的IP地址为202.123.25.36,掩码为255.255.254.0。如果该主机需要在该网络进行直接广播,那么它应该使用的目的地址为( )
-
- A.202.123.25.0
- B.202.123.25.255
- C.202.123.24.0
- D.202.123.24.255
- 查看答案
在计算机系统的日常维护工作中,应当注意硬盘工作时不能__(2)__。另外,需要防范病毒,而__(3)__是不会被病毒感觉的。
-
- A.电子邮件
- B.硬盘
- C.U盘
- D.ROM
- 查看答案
有 4 个 IP 地址:201.117.15.254、201.117.17.01、201.117.24.5 和 201.117.29.3,如果子网掩码为 255.255.248.0,则这 4 个地址分别属于3个子网;其中属于同一个子网的是()
-
- A.201.117.15.254 和 201.117.17.01
- B.201.117.17.01 和 201.117.24.5
- C.201.117.15.254 和 201.117.29.3
- D.201.117.24.5 和 201.117.29.3
- 查看答案
在异步通信中,每个字符包含1位起始位、7位数据位、1位奇偶位和1位终止位,每秒钟传送200个字符,采用4相位调制,则码元速率为()。
-
- A.50波特
- B.500波特
- C.550波特
- D.1000波特
- 查看答案
在 Windows 中,运行( )命令得到下图所示结果。以下关于该结果的叙述中,错误的是( )。
Pinging 59.74.111.8 with 32 bytes of data:
Reply from 59.74.111.8: bytes=32 time=3ms TTL=60
Reply from 59.74.111.8: bytes=32 time=5ms TTL=60
Reply from 59.74.111.8: bytes=32 time=3ms TTL=60
Reply from 59.74.111.8: bytes=32 time=5ms TTL=60
Ping statistics for 59.74.111.8:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 3ms, Maximum = 5ms, Average = 4ms
-
- A.该命令使得本地主机向目标主机发送了 4 个数据包
- B.本地主机成功收到了目标主机返回的 4 个数据包
- C.本地主机与目标主机连接正常
- D.该命令用于查看目标主机的 IP 地址
- 查看答案