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

试题四(共15分)
    阅读以下说明和c函数,填补c函数中的空缺(1)—(5),将解答写在答题纸的对应栏内。  
【说明】  
    约瑟夫问题如下所述:有n个人(编号为1~n)围成一圈,从第一个人开始,按照顺时针方向从1开始计数到m(即数到第m个人),让其出圈,然后再从其顺时针方向的下一个人开始,依次计数到m并让其出圈,重复这个过程,直到所有人都出圈,试给出出圈者的顺序。  
    以n=5,m=3为例,其中圈顺序为3,1,5,2,4,过程如下图所示。
    
    下面的函数Joseph()在单向循环链表表示的基础上诉出圈的过程。 
    n为5时的单向循环链表结构如下图所示。
    
    链表的结合类型定义如下: 
    typedef struct Node  {
        int no;
        struct Node*next; 
    }Node,*LinkList;  
    函数Joseph(LinkList tail,int n,int m)的处理思路如下:  
    (1)用k计数,每次都从0开始,当计数到m-1时结束本次计数;  
    (2)通过指针p查找出圈者所对应的结点,当K的值等于是m-1时,P应指向出圈者对应结点的前驱结点;  
    (3)通过删除结点表示出圈处理;  
    (4)当m大于圈中剩余人数时,为了避免重复计数,用模运算修改m的值; 
    (5)计数和删除操作完成后再恢复m的原值;
【C函数】  
void Joseph(LinkList tail,int n,int m) 
{     /*单循环链表包含n个结点,tail为链表的尾指针,m为计数值*/
LinkList p,q; 
int k,i,old_m=m; 
 
p=tail;  
for(i=n;i>1;--i)  {                       /*i 表示圈中剩余人数*/ 
          m=m%i;                         /*避免重复计数*/ 
if(0==m)    m=(1); 
   k=0;  
       while(k<(2))   {
            (3);  
k++; 
       }  
       printf("%d\n",(4));    /*输出出圈者的编号*/ 
q=p->next;  
(5)=q->next;       /*删除出圈者对应的结点*/ 
free(q); 
          m=old_m; 
     }  
     printf(“%d\n”,p->No); 


相关试题

推荐文章
合作网站内容