软题库 移动APP 扫码下载APP 随时随地移动学习 培训课程
当前位置:信管网 >> 在线考试中心 >> 信息系统项目管理师题库 >> 试题查看
试卷名称 2013年上半年程序员考试下午真题试题(案例分析)
考试中心《2013年上半年程序员考试下午真题试题(案例分析)》在线考试
试卷年份2013年上半年
试题题型【分析简答题】
试题内容

阅读以下说明和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;  /*返回最后一个游戏者(即获胜者)的编号*/
}


相关试题

推荐文章
合作网站内容