C语言,出圈问题!急急急急急急急急!!!

59.设有n个人坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,此人出圈,再从他的下一个人重新开始从1到m报数,如此进行下去直到所有的人... 59. 设有n个人坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,此人出圈,再从他的下一个人重新开始从1到m报数,如此进行下去直到所有的人都出圈为止。先要求按出圈次序,每10个人为一组,给出这n个人的顺序表。请编制函数Josegh()实现此功能并调用函数WriteDat()把编号按照出圈顺序输出到文件OUT59.DAT中。
设n=100,s=1,m=10进行编程。
注意:部分源程序已给出。
请勿改动主函数main()和写函数WriteDat()的内容。
试题程序:
设有n个人坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,此人出圈,再从他的下一个人重新开始从1到m报数,如此进行下去直到所有的人都出圈为止。先要求按出圈次序,每10个人为一组,给出这n个人的顺序表。请编制函数Josegh()实现此功能并调用函数WriteDat()把编号按照出圈顺序输出到文件OUT59.DAT中。
设n=100,s=1,m=10进行编程。
注意:部分源程序已给出。
请勿改动主函数main()和写函数WriteDat()的内容。
试题程序:
#include<stdio.h>
#define N 100
#define S 1
#define M 10
int p[100],n,s,m;
void WriteDat(void);
void Josegh(void)
{
}
void main()
{
m=M; n=N; s=S;
Josegh();
WriteDat();
}
void WriteDat(void)
{
int i;
FILE *fp;
fp=fopen("OUT59.DAT","w");
for(i=N-1;i>=0;i--)
{
printf("%4d",p[i]);
fprintf(fp,"%4d",p[i]);
if(i%10==0)
{
printf("\n");
fprintf(fp,"\n");
}
}
fclose(fp);
}
展开
 我来答
ytunx
2009-03-28 · 超过45用户采纳过TA的回答
知道答主
回答量:105
采纳率:0%
帮助的人:144万
展开全部
//你也有够懒的啊,自己随便便改改不就行了。没办法,为了你那十分,我改吧

void Josegh(void)
{
struct node
{
int id;
struct node * next;
}; // 单向链表节点,但该链表最后一个节点指向头结点,形成环
int i, index; // i为循环变量, index为返回数组的索引
struct node *tail, *list = NULL; //list为链表头指针, tail为尾指针,只在创建时有用
// 创建链表
for (i=0; i<n; i++)
{
if (list == NULL)
{
list = (node *)malloc(sizeof(node));
list->id = i+1;
list->next = NULL;
tail = list;
}
else
{
struct node *temp = (node *)malloc(sizeof(node));
temp->id = i+1;
tail->next = temp;
temp->next = NULL;
tail = temp;
}
}
// 将链表尾指针指向头,形成环
tail->next = list;
// head为临时的链表头,用来操作链表
struct node *head = list;
//找到从第几个开始报数
while (head->id != s)
head = head->next;
index = 99;
// 判断,如果最后出圈只剩一个人为止
while (head->next != NULL)
{
struct node *temp; // 临时节点,存放出圈人的前一个人
for (i=1; i<m; i++)
{
temp = head;
head = head->next;
}
// 找到该出圈的人,即为head指向的节点,但要判断,目前是不是只有两个人
//如果超过两人如下:
if (head->next != temp)
{
temp->next = head->next;
p[index--] = head->id; // 把出圈人的编号输入数组
free(head);
head = temp->next;
}
else // 只剩两人,直接出圈
{
p[index--] = head->id;
p[index] = temp->id;
free(head);
head = temp;
head->next = NULL;
}
}
}

//////////////

我写了一个,可以作参考,希望对你有帮助。
#include <stdio.h>
#include <stdlib.h>
//函数返回值为一个整型数组,存放出圈顺序
int * Josegh(int n, int s, int m);

int main()
{
int *a, i;
a = Josegh(100, 1, 10);
for (i=0; i<100; i++)
printf("%d\t", a[i]);
return 0;
}

int * Josegh(int n, int s, int m)
{
struct node
{
int id;
struct node * next;
}; // 单向链表节点,但该链表最后一个节点指向头结点,形成环
int i, index, *ret; // i为循环变量, index为返回数组的索引, ret为返回数组名
struct node *tail, *list = NULL; //list为链表头指针, tail为尾指针,只在创建时有用
ret = (int *)malloc(sizeof(int)*100);
// 创建链表
for (i=0; i<n; i++)
{
if (list == NULL)
{
list = (node *)malloc(sizeof(node));
list->id = i+1;
list->next = NULL;
tail = list;
}
else
{
struct node *temp = (node *)malloc(sizeof(node));
temp->id = i+1;
tail->next = temp;
temp->next = NULL;
tail = temp;
}
}
// 将链表尾指针指向头,形成环
tail->next = list;
// head为临时的链表头,用来操作链表
struct node *head = list;
//找到从第几个开始报数
while (head->id != s)
head = head->next;
index = 0; // 初始化数组索引
// 判断,如果最后出圈只剩一个人为止
while (head->next != NULL)
{
struct node *temp; // 临时节点,存放出圈人的前一个人
for (i=1; i<m; i++)
{
temp = head;
head = head->next;
}
// 找到该出圈的人,即为head指向的节点,但要判断,目前是不是只有两个人
//如果超过两人如下:
if (head->next != temp)
{
temp->next = head->next;
ret[index++] = head->id; // 把出圈人的编号输入数组
free(head);
head = temp->next;
}
else // 只剩两人,直接出圈
{
ret[index++] = head->id;
ret[index] = temp->id;
free(head);
head = temp;
head->next = NULL;
}
}
return ret;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式