用c语言解决约瑟夫问题,我的程序哪里出错了呢?(用循环单链表解决)

#include<stdio.h>#include<stdlib.h>typedefstructNode{intdata;structNode*next;}ListNod... #include<stdio.h>
#include<stdlib.h>
typedef struct Node{
int data;
struct Node * next;
}ListNode;
typedef ListNode * LinkList;
void main(){
LinkList R=NULL;
int n,k;
LinkList InitRing(int n, LinkList R);
LinkList DeleteDeath(int n, int k, LinkList R);
void OutRing(int n, LinkList R);
printf("请输入总人数n和报数上限k:");
scanf("%d%d",&n, &k);
R=InitRing(n, R);
R=DeleteDeath(n, k, R);
OutRing(n, R);
}
LinkList InitRing(int n, LinkList R)
{
ListNode *p, *q;
int i;
q=R;
for(i=1;i<=n;i++){
p=(ListNode *)malloc(sizeof(ListNode));
q->data=i;
q->next=p;
p->next=R;
}

return R;
}
LinkList DeleteDeath(int n, int k, LinkList R)
{
int count=n;
int m;
ListNode *p=R,*q;
for(m=1;count>15;count--){
while(m<k){
p=p->next ;
m++;
}
printf("%4d", p->next->data);
q=p->next;
p->next = q->next;
free(q);

}
R=p;
return R;
}

void OutRing(int n, LinkList R)
{
int i;
ListNode *p;
p=R;
for(i=1;i<=n/2; i++){
printf("%4d", p->data);
p=p->next;
}
}
约瑟夫游戏的大意是:有30个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分;因此船长告诉乘客,只有将全船一半的旅客投入海中,其余人才能幸免于难。无奈,大家只得同意这种办法,并议定30个人围成一圈,由第一个人数起,数到第9人,再将他扔进大海中,如此循环地进行,直到剩下15个乘客为止。问哪些位置是将被扔下大海的位置?
求大神。。。。~~~~
展开
 我来答
百度网友83cdc1c
推荐于2016-04-08 · TA获得超过5792个赞
知道大有可为答主
回答量:1907
采纳率:100%
帮助的人:848万
展开全部
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
    int data;
    struct Node * next;
 }ListNode;
 typedef ListNode * LinkList;

LinkList InitRing(int n, LinkList R);
LinkList DeleteDeath(int n, int k, LinkList R);
void OutRing(int n, LinkList R);
void main()
 {
     LinkList R=NULL;
     int n,k;
     printf("请输入总人数n和报数上限k:");
     scanf("%d%d",&n, &k);
     R=InitRing(n, R);
     R=DeleteDeath(n, k, R);
     OutRing(n, R);
}
LinkList InitRing(int n, LinkList R)
{
    ListNode *p, *q;
    int i;
    q=R;
    for(i=1;i<=n;i++){
        p=(ListNode *)malloc(sizeof(ListNode));
        p->data=i;
        if(q)
            q->next=p;
        else
            R=p;
        p->next=R;
        q=p;
    }
    OutRing(n,R);
    return R;
}
LinkList DeleteDeath(int n, int k, LinkList R)
{
    int m;
    ListNode *p=R,*q;
    for(;n>15;n--){
        for(m=1;m<k-1;m++)
            p=p->next;
        printf("%4d", p->next->data);
        q=p->next;
        p->next = q->next;
        free(q);
        p=p->next;
    }
    R=p;
    printf("\n");
    return R;
}

void OutRing(int n, LinkList R)
{
    int i;
    ListNode *p;
    p=R;
    do{
        printf("%4d", p->data);
        p=p->next;
    }while(p!=R);

    printf("\n");
}

三个函数都有些问题,改了改,输出中间一行就是被扔进海里的。

追问
大神。。。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式