用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个乘客为止。问哪些位置是将被扔下大海的位置?
求大神。。。。~~~~ 展开
#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个乘客为止。问哪些位置是将被扔下大海的位置?
求大神。。。。~~~~ 展开
1个回答
展开全部
#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");
}
三个函数都有些问题,改了改,输出中间一行就是被扔进海里的。
追问
大神。。。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询