pzq25 2016-11-09 00:58 采纳率: 0%
浏览 1164

约瑟夫问题,递归函数不对

图片说明

 #include<stdio.h>               //约瑟夫问题,共n个人,从x开始数数,数到y时去掉,要求最后剩下的一个人编号为1 

typedef int elemtype;
typedef struct{
        elemtype data;
        struct Node *next;
        }*Linklist,Node;

int f(Node *start,int n,int y,Linklist L)   //递归算法 
{
    Node *s,*p;
    elemtype e;
    int i;
    if (n==1&&start->data==1) return 1;     //若最后剩下1,则返回1 
    if (n==1) {printf("%d\n",start->data);return 0;} //其他则输出最后的编号,并返回0 
    for (i=1,p=start;i<y-1;i++)    // 删除数到y的 
    {
        p=p->next;
    }
    s=p->next;
    e=s->data;
    p->next=s->next;
    free(s);        
    printf("%d\t",e);           //输出删除的编号 
    start=p->next;
    f(start,n-1,y,L);
}
void TraverseList(Linklist L)
{
     Node *p=L;
     while(p->data!=5)
     {
             printf("%d\t",p->data);
             p=p->next;
     }
     printf("\n");
}       
int main() 
{
    Linklist L;
    L=(Linklist)malloc(sizeof(Node));
    Node *start,*p,*s;
    int y,n,x,i,c;
    printf("请输入总人数:\n");
    scanf("%d",&n);
    L->data=1;                //编号 
    L->next=NULL;
    p=L;
    for (i=2;i<=n;i++)
    {
        s=(Node*)malloc(sizeof(Node));
        s->data=i;
        s->next=p->next;
        p->next=s;
        p=p->next;
    }
    p->next=L;          //围圈 
    TraverseList(L);
    for (x=1;x<2;x++)   //先固定x只能为1 
    {
        for (i=1,p=L;i<x;i++) p=p->next;  
        start=p;
        for(y=2;y<n;y++)    //y可从2~n-1变化 
        {
            if (f(start,n,y,L)==1) printf("x:%d\t y:%d\n",x,y);   //如果返回值为1,说明最后剩下了1,输出x,y的值 
            Linklist L;   //由于前面删除了链表,所以重新建立单循环链表 
            L=(Linklist)malloc(sizeof(Node));
            L->data=1;
            L->next=NULL;
            p=L;
            for (i=2;i<=n;i++)
            {
                s=(Node*)malloc(sizeof(Node));
                s->data=i;
                s->next=p->next;
                p->next=s;
                p=p->next;
            }
            p->next=L;
            TraverseList(L);
        }
    }
    getch();
    return 0;
}  
  • 写回答

1条回答 默认 最新

报告相同问题?

悬赏问题

  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥20 为什么我写出来的绘图程序是这样的,有没有lao哥改一下
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥200 关于#c++#的问题,请各位专家解答!网站的邀请码
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号