编程高手来。。。求个C语言程序

猴子选大王**任务:一堆猴子都有编号,编号是1,2,3...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直... 猴子选大王**
任务:一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
要求:
输入数据:输入m,n m,n 为整数,n<m
输出形式:中文提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号 ,建立一个函数来实现此功能
下面是我写的程序。。程序无错,但是运行出错:
#include "stdio.h"
#include "stdlib.h"
typedef struct node
{
int data ;
struct node *next;
}
NODETYPE;

NODETYPE *initial(int m) /*生成含有m个结点的环形链表*/
{
int i;
NODETYPE *head,*p,*s;
p=(NODETYPE*)malloc (sizeof(NODETYPE)); /*开辟第一个结点*/
head=p; /*头指针指向第一个结点*/
p->data=1; /*第一只猴子的编号为1*/
for(i=2;i<=m;i++) /*循环生成第2~m个结点*/
{
s=(NODETYPE*)malloc(sizeof(NODETYPE)); /*生成新结点*/
s->data=i; /*存入猴子的编号*/
p->next=s; /*新结点连表尾*/
p=s;
}
p->next=head; /*形成环*/
return head;

}

int selecking(NODETYPE *head,int c ) /*选猴王*/
{
NODETYPE *p,*q;
int t;
p=head; t=0; /*置初值*/
do
{
t++; /*继续报数*/
if (t%c!=0) /*t不能被c整*/
q=p;
else /*t能被c整除*/
q->next=p->next; /*删去一个结点*/
free (q);
p=q->next; /*指向下一个结点*/
}
while(p->next!=p); /*链表中不止一个结点时循环*/
return (p->data); /*返回猴王的编号*/
}

void main()
{
NODETYPE *head; int n,k,king;
NODETYPE *initial(int m);
printf("input monkey number& called number;");
scanf("%d%d",&n,&k);
head = initial(n);
king = selecking(head,k);
printf("The king is: &d\n",king);
}
摆脱高手帮我修改下啊
展开
 我来答
zhaozhouping78
2009-11-21 · TA获得超过121个赞
知道答主
回答量:160
采纳率:0%
帮助的人:84.7万
展开全部
楼上的我又发现个小问题,被我修改了,完全运行通过

#include "stdio.h"
#include "stdlib.h"
typedef struct node
{
int data ;
struct node *next;
}
NODETYPE;

NODETYPE *initial(int m) /*生成含有m个结点的环形链表*/
{
int i;
NODETYPE *head,*p,*s;
p=(NODETYPE*)malloc (sizeof(NODETYPE)); /*开辟第一个结点*/
head=p; /*头指针指向第一个结点*/
p->data=1; /*第一只猴子的编号为1*/
for(i=2;i<=m;i++) /*循环生成第2~m个结点*/
{
s=(NODETYPE*)malloc(sizeof(NODETYPE)); /*生成新结点*/
s->data=i; /*存入猴子的编号*/
p->next=s; /*新结点连表尾*/
p=s;
}
p->next=head; /*形成环*/
return head;

}

int selecking(NODETYPE *head,int c ) /*选猴王*/
{
NODETYPE *p,*q;
int t=0;
p=head; /*置初值*/
do
{
t++; /*继续报数*/
if (t%c!=0) /*t不能被c整*/
{
p = p->next;
}
else /*t能被c整除*/
{
q = p->next;
p->next=p->next->next; /*删去一个结点*/
free (q);
p=p->next; /*指向下一个结点*/
}
}
while(p->next != p);
/*链表中不止一个结点时循环*/

return (p->data); /*返回猴王的编号*/
}

void main()
{
NODETYPE *head; int n,k,king;
NODETYPE *initial(int m);
printf("input monkey number& called number;");
scanf("%d,%d",&n,&k);
head = initial(n);
king = selecking(head,k);
printf("The king is %d\n",king);
}

select中删除节点出错了,应该先用q保存要删除节点的地址,然后将p指向的节点的next指针指向到删除节点的下一个节点。

这个其实就是”约瑟夫环” 问题其实只需要把有N个数就行了,每次用剩余的数M,第N-m个离开,就可以了用变量记一下开始猴子为i最大的猴子为j非常简单的程序啊
wcwanchang
2009-11-21 · TA获得超过189个赞
知道小有建树答主
回答量:86
采纳率:0%
帮助的人:0
展开全部
调试了一下发现是select中出错了。
#include "stdio.h"
#include "stdlib.h"
typedef struct node
{
int data ;
struct node *next;
}
NODETYPE;

NODETYPE *initial(int m) /*生成含有m个结点的环形链表*/
{
int i;
NODETYPE *head,*p,*s;
p=(NODETYPE*)malloc (sizeof(NODETYPE)); /*开辟第一个结点*/
head=p; /*头指针指向第一个结点*/
p->data=1; /*第一只猴子的编号为1*/
for(i=2;i<=m;i++) /*循环生成第2~m个结点*/
{
s=(NODETYPE*)malloc(sizeof(NODETYPE)); /*生成新结点*/
s->data=i; /*存入猴子的编号*/
p->next=s; /*新结点连表尾*/
p=s;
}
p->next=head; /*形成环*/
return head;

}

int selecking(NODETYPE *head,int c ) /*选猴王*/
{
NODETYPE *p,*q;
int t=0;
p=head; /*置初值*/
do
{
t++; /*继续报数*/
if (t%c!=0) /*t不能被c整*/
{
p = p->next;
}
else /*t能被c整除*/
{
q = p->next;
p->next=p->next->next; /*删去一个结点*/
free (q);
p=p->next; /*指向下一个结点*/
}
}
while(p->next != p);
/*链表中不止一个结点时循环*/

return (p->data); /*返回猴王的编号*/
}

void main()
{
NODETYPE *head; int n,k,king;
NODETYPE *initial(int m);
printf("input monkey number& called number;");
scanf("%d,%d",&n,&k);
head = initial(n);
king = selecking(head,k);
printf("The king is %d\n",king);
}

select中删除节点出错了,应该先用q保存要删除节点的地址,然后将p指向的节点的next指针指向到删除节点的下一个节点。

忘了说了,我把输入的方式改成了 两个数要用逗号隔开
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2009-11-21
展开全部
老大 有必要用链表么

这个其实就是”约瑟夫环” 问题

有高效的数学方法
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式