| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 441 人关注过本帖
标题:【求助】关于Josephu问题
只看楼主 加入收藏
li8311559
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-12-13
收藏
 问题点数:0 回复次数:1 
【求助】关于Josephu问题
1)问题描述
Josephu问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
(2)输入与输出
输入:人数n和整数m
输出:出队编号的序列
提示:用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。此题还可以用一维数组来实现,想想应如何实现。还可以归纳总结出一般性规律,看看该问题是否能够用数学上的取摸运算来实现。




#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
         int date;
         struct node *next;
}LNode,*LinkList;
LinkList creat(int n)/*建立循环单链表*/
{
          LinkList L=NULL;
          LNode *s,*r=NULL;
          int i;
          for(i=1;i<=n;i++)
          {
                           s=(LNode*)malloc(sizeof(LNode));
                           s->date=i;
                           if(L==NULL)L=s;
                           else r->next=s;
                           r=s;
          }
          r->next=L->next;
          return L;
}
void josephu(LinkList L,int k,int m)/*k指约定的编号,m指出对的数*/
{
                  LNode *p=L->next,*q;
                  int i=1;
                  while(p&&i<k)
                  {            
                               i++;

                     p=p->next;
                              
                  }
                  i=1;
                  while(p&&i<m)
                  {
                               p=p->next;
                               i++;
                               if(i==m)
                               {
                                       printf("%d",p->date);
                                       q=p->next;
                                       p->next=q->next;
                                       free(q);
                                       p=p->next;
                                       i=1;
                               }
                  }
}
main()
{
       LinkList L;
       int n,k,m;
       printf("输入人数");
       scanf("%d",&n);
       printf("输入开始位置");
       scanf("%d",&k);
       printf("输入出对数");
       scanf("%d",&m);
       L=creat(n);
       josephu(L,k,m);
       system("pause");
}      





我写的程序死循环,到底哪错了
                 
                              
搜索更多相关主题的帖子: Josephu 
2010-12-13 20:48
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
         int date;
         struct node *next;
}LNode,*LinkList;

LinkList creat(int n)/*建立循环单链表*/
{
    LinkList L=NULL;
    LNode *s,*r=NULL;
    int i;
    for(i=1;i<=n;i++)
    {
        s=(LNode*)malloc(sizeof(LNode));
        s->date=i;
        s->next = NULL;
        if(L==NULL)
            r = L = s;
        else
            r->next=s;
        r=s;
    }
    //r->next=L->next;
    r->next = L;
   
    return L;
}
LinkList search( LinkList L, LinkList l )
{
    LinkList temp = L;
    while ( l != temp->next )
        temp = temp->next;

    return temp;

}
void josephu(LinkList L,int k,int m)/*k指约定的编号,m指出对的数*/
{
    LNode *p=L,*q, *f;
    int i=1;
    while(i<k)
    {           
        i++;
        p = p->next;                      
    }
    i=1;               
    //while(p&&i<m)                 
    while(p != p->next)
    {                            
        if(i==m)
        {
            f = search(L, p);
            printf("%d",p->date);
            q = p;
            p = p->next;
            f->next = p;
            i=1;
            free(q);
        }
        else
        {
            p=p->next;
            ++i;
        }
    }
    printf("%d",p->date);
}

int main()
{
       LinkList L = NULL;
       int n,k,m;
       printf("输入人数");
       scanf("%d",&n);
       printf("输入开始位置");
       scanf("%d",&k);
       printf("输入出对数");
       scanf("%d",&m);
       L=creat(n);
       josephu(L,k,m);
       system("pause");

       return 0;
}      

/*我写的程序死循环,到底哪错了*/
2010-12-16 08:38
快速回复:【求助】关于Josephu问题
数据加载中...
 
   



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

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