标题:13个人围城一圈报数,报到3退出圈子,就是猴子选大王问题,链表算法看不懂, ...
只看楼主
yz912498286
Rank: 1
等 级:新手上路
帖 子:49
专家分:3
注 册:2015-8-24
结帖率:100%
已结贴  问题点数:20 回复次数:4 
13个人围城一圈报数,报到3退出圈子,就是猴子选大王问题,链表算法看不懂,求注释!!![em06]
13个人围城一圈报数,报到3退出圈子,就是猴子选大王问题,链表算法看不懂,求注释!!!  例如 如果是3个人报数 如123 则最后剩下2
#include <stdio.h>
#define N 13
struct person  
{    int number;
     int nextp;  
} link[N+1];

int main()   
{ int i,count,h;  
  for (i=1;i<=N;i++)     
    {if (i==N)         
        link[i].nextp=1;     
     else        
        link[i].nextp=i+1;     
     link[i].number=i;     
    }   
  printf("\n");   
  count=0;
  h=N;   
  printf("sequence that persons leave the circle:\n");
  while(count<N-1)  
  {
     i=0;      
     while(i!=3)         
     {
         h=link[h].nextp;     
         if (link[h].number) i++;     
     }       printf("%4d",link[h].number);  
    link[h].number=0;      
    count++;   
 }   
  printf("\nThe last one is ");   
  for (i=1;i<=N;i++)     
    if (link[i].numbe)
  printf("%3d",link[i].number);   
  printf("\n");  
  return 0;
}

[ 本帖最后由 yz912498286 于 2015-9-16 09:15 编辑 ]
搜索更多相关主题的帖子: include person number count 大王 
2015-09-15 11:00
voiceshen
Rank: 2
等 级:论坛游民
帖 子:21
专家分:58
注 册:2015-9-8
得分:10 
问题不是太清楚,是报到3后退出,下一个接着报1吗?
2015-09-15 11:30
yz912498286
Rank: 1
等 级:新手上路
帖 子:49
专家分:3
注 册:2015-8-24
得分:0 
回复 2楼 voiceshen
是的  我去把题目要求写详细些
2015-09-16 09:14
gold615
Rank: 2
等 级:论坛游民
帖 子:54
专家分:75
注 册:2014-6-7
得分:10 
感觉楼主给的代码有点儿乱,没看明白,而且那个好像仅仅是个结构体数组而不是链表吧。我写了一个,之前一直想自己写约瑟夫环,感觉还是有一定麻烦的。
#include<stdio.h>
#include<stdlib.h>
#define N 13
#define M 3
typedef struct node//第一个保存位置数值,第二个保存下一个结构体的位置
{
    int seat_num;
    node *next;
}seat;
seat *Creat()
{
    seat *head=NULL,*p=NULL;
    int i;
    head=(seat *)malloc(sizeof(seat));
    if(!head)
    {
        exit(0);
    }
    head->next=NULL;
    head->seat_num=1;//先定义第一个位置的信息
    p=head;
    for(i=2;i<=N;i++)
    {
        p->next=(seat *)malloc(sizeof(seat));
        if(!(p->next))
        {
            exit(0);
        }
        p->next->next=head;//将链表形成一个循环,方便计数。
        p->next->seat_num=i;
        p=p->next;
    }
   
    return head;
}
void Choose(seat *head)
{
    int count=2;//从第二个位置开始,因此count为2.
    seat *p=head->next,*q,*temp=head;//p表示当前计数到的节点位置,而temp表示它的前驱结点,
    for(;p->next!=temp;)//因为将来涉及到释放满足==3的节点 ,所以需要保存前驱结点。
    {
        if(count==M)
        {
            count=1;//满足==3,将count归为1
            temp->next=p->next;
            free(p);
            p=temp->next;   
        }
        else
        {
            temp=p;
            count++;
            p=p->next;
        }
    }
    printf("the winner is %d.\n",temp->seat_num);//最后剩下两个节点,且互为前驱结点
    //通过简单的作图便可以知道此时剩下的肯定是temp那个点了。
    free(p);
    free(temp);
}
int main()
{
    seat *head=Creat();
    seat *temp=head;
    printf("\n");
    Choose(head);
    printf("\n");
    return 0;
}
2015-09-20 16:37
来生再见
Rank: 1
来 自:江西省抚州市
等 级:新手上路
威 望:1
帖 子:39
专家分:9
注 册:2015-9-13
得分:0 
以下是引用yz912498286在15/9/2015 11:00:24的发言:

13个人围城一圈报数,报到3退出圈子,就是猴子选大王问题,链表算法看不懂,求注释!!!  例如 如果是3个人报数 如123 则最后剩下2
#include <stdio.h>
#define N 13
struct person  
{    int number; //这个成员存储的是person的序号
     int nextp;  //下一个成员的序号
} link[N+1];

int main()   
{ int i,count,h;  
  for (i=1;i<=N;i++)     
    {if (i==N)         
        link.nextp=1;  //为了可以循环的遍历结构体的元素,最后一个元素的时候,让他nextp=1,可以遍历到下一个元素   
     else        
        link.nextp=i+1;//遍历下一个元素     
     link.number=i;     
    }   
  printf("\n");   
  count=0;
  h=N;   
  printf("sequence that persons leave the circle:\n");
  while(count<N-1)  
  {
     i=0;      
     while(i!=3)         
     {
         h=link[h].nextp;     
         if (link[h].number) i++;   //i++,但是因为后面会不断使得number=0,所以以后判断需要加上link[h].number判断number是不是非0  
     }      
    printf("%4d",link[h].number);  //输出退出圈子的结构体
    link[h].number=0;      //置为0,退出圈子
    count++;    //记录退出几个
 }   
  printf("\nThe last one is ");   
  for (i=1;i<=N;i++)     
    if (link.numbe)
  printf("%3d",link.number);   
  printf("\n");  
  return 0;
}



这个是数组的不是链表的,来给你写点注释吧

重新开始,努力
2015-09-21 23:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-457322-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.566491 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved