阅读以下说明和C程序,填充函数中的空缺,将解答填入答题纸的对应栏内。 【说明】 N个游戏者围成一圈,从1~N顺序编号,游戏方式如下;从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,直到剩余一个游戏者为止,该游戏者即为获胜者。

admin2013-07-03  35

问题 阅读以下说明和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

解析 本题要求完成程序,该程序的功能是删除报  号为3的结点,直到剩下一个结点为止。while语句中的n  的取值范围从1到N,又因为while语句先执行中括号里的  语句在判断n值,所以(1)应填n>1,while语句中的if条件  语句是判断p指向的下一结点是否该删除,若当c为2时,  则p指向的当前结点报号为2,p指向的下一个结点,即p-  >next的报号应为3,该删除,这时应该将p->next的指  向c为3的结点的下一个结点,即p->next->next,再将  p->next删除,所以(2)应该填p->next->next,删除P  ->next之后将开始新一轮的报数,根据题意,将c值重新  设置为0后继续,所以(3)对c重新赋值,应该填0,此时,n  个数已经删去一个数,所以n的值相应的要减少,if语句执  行完后,跳出if语句,将p重新赋值,即(4)p=p->next,  当从1到n都执行一遍后,会有一个人留下,即为获胜者,  (5)是给获胜者编号赋值所以应该填p->code,最后返回  获胜者编号,该程序执行完毕。
转载请注明原文地址:https://kaotiyun.com/show/jnjZ777K
0

最新回复(0)