回 帖 发 新 帖 刷新版面

主题:[讨论]我设计的Josephus环问题的C程序,看看有什么问题.

Josephus环问题
设编号为1、2、…N的n个人围坐一圈,约定编号为K(1≤K≤N)的人从1开始报数,数到M的那个人出列,它的下一位又从1开始报数,数到M的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。

#include <stdio.h>
#include <malloc.h>
#define N 10
#define M 3
#define K 4

typedef struct node
{int number;
 struct node *next;}
lnode

main()
{int i,j,quit[N],k=0;
 lnode *head,*r,*s,*p;
 head=null;
 r=null;
 for(i=1;i<=n;i++)
 {s=(lnode*)malloc(size of (lnode));
  s->number=i;
  if(head==null)
    head=s;
  else
    r->next=s;
    r=s;}
 if(r!=null)
    r->next=head;
 
 p=head;
 
 for(i=1;i<K;i++)
 p=p->next;
 
 while(k!=N)
 {
  for(j=1;j<M;j++)
   p=p->next;
  quit[i++]=p->next->number;
  k++;
  Delete(p);}

 for(i=0;i<N;i++)
 pritf("the NO.d% is d%\n",i+1,a[i]);
 }

Delete(lnode *p)
{lnode *r;
 if(p->next!=null)
  {r=p->next;
   p->next=r->next;
   free(r)}
 }

高手帮我看看,总是说我的主函数说明语法错误,我看了很长时间,就是看不出.

算法是:
由于当某个人退出圆圈后,报数的工作要从下一个人开始继续,剩下的人仍然是围成一个圆圈的,可以使用循环表,由于退出圆圈的工作对应着表中结点的删除操作,对于这种删除操作频繁的情况,选用效率较高的链表结构,为了程序指针每一次都指向一个具体的代表一个人的结点而不需要判断,链表不带头结点。所以,对于所有人围成的圆圈所对应的数据结构采用一个不带头结点的循环链表来描述。设头指针为p,并根据具体情况移动。
为了记录退出的人的先后顺序,采用一个顺序表进行存储。程序结束后再输出依次退出的人的编号顺序。由于只记录各个结点的number值就可以,所以定义一个整型一维数组。如:int  quit[n];n为一个根据实际问题定义的一个足够大的整数。

回复列表 (共7个回复)

沙发

typedef int INT;

记得后面要有;

用链表可以做。

板凳

谢谢,我又重新改了一下,没语法错误了,但运行结果不行,不知你有什么高见

3 楼

#include <stdio.h>
#include <malloc.h>
#define N 10
#define M 3
#define K 4


typedef struct node
{int number;
 struct node *next;}
lnode;

Delete(lnode *p)
{lnode *r;
 if(p->next!=NULL)
  {r=p->next;
   p->next=r->next;
   free(r);}
 }

main()
{int i,j,quit[N],k=0;
 lnode *head,*r,*s,*p;
 head=NULL;
 r=NULL;
 for(i=1;i<=N;i++)
 {s=(lnode*)malloc(sizeof(lnode));
  s->number=i;
  if(head==NULL)
    head=s;
  else
    r->next=s;
    r=s;}
 if(r!=NULL)
    r->next=head;

 p=head;

 for(i=1;i<K;i++)
 p=p->next;

 while(k!=N)
 {
  for(j=1;j<M;j++)
   p=p->next;
  quit[i++]=p->next->number;
  k++;
  Delete(p);}

 for(i=0;i<N;i++)
 printf("the NO.%d is %d\n",i+1,quit[i]);
 }



4 楼

void Josephus(int n,int m)
{
 int i,j,k,*next
 next=malloc(n*sizeof(int));
 for(i=0;i<n-1;i++)) next[i]=i+1;
 k=n-1;next[k]=0;
 for(i=1;i<n;i++){
    for(j=1;j<m;j++ k=next[k];
 printf("Dele contestant %d\n",next[k]+1);
 next[k]=next[next[k]];
 }
printf("Contestant %d wins the cruise \n",next[k]+1);
}
这样更好

5 楼

for(j=1;j<m;j++)

6 楼

谢了.

7 楼


#include <iostream.h>
 struct List
{
    int date;
    struct List *next;
};
void InitList(struct List **head)
{
    *head=NULL;
}
void fndList(struct List **head,int max)
{
    int i;
    *head=new List;
    struct List *point1,*point2;
    point1=*head;
    point1->date=1;
    point1->next=NULL;
    for(i=1;i<max;i++)
    {
        point2=new List;
        point1->next=point2;
        point1=point1->next;
        point1->date=i+1;
    }
    point1->next=*head;
    
}
void TraverseList(struct List *head,int Max)
{
    int i;
    for(i=1;i<Max;i++)
    {
        cout<<head->date<<" ";
        head=head->next;
    }
    cout<<head->date<<endl;
}
void OutList(struct List **head,int a,int b)
{
    struct List *point,*flag;
    int i;
    point=*head;
    for(i=1;i<b;i++)
        point=point->next;
    while(point!=point->next)
    {
        for(i=1;i<a;i++)
        point=point->next;
        flag=point->next;
        cout<<endl;
        cout<<flag->date<<"号猴子被淘汰"<<endl;
        
        point->next=flag->next;
        //delete point;
        flag=flag->next;
    }
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<"恭喜"<<flag->date<<"号猴子是大王"<<endl;
    delete flag;

}
void main()
{
    int m,n,p;
    struct List *top;
    cout<<"请输入猴子的数量m:"<<endl;
    cin>>m;
    cout<<"你想从第几只猴子开始报数"<<endl;
    cin>>p;
    cout<<"你想报数为第几的猴子出列"<<endl;
    cin>>n;
    InitList(&top);
    fndList(&top,m);
    TraverseList(top,m);
    OutList(&top,n,p);
}





我来回复

您尚未登录,请登录后再回复。点此登录或注册