急!C语言约瑟夫环问题。网down的就不要了,在线等高手

设有n个人(编号为1,2,3 ,…… ,n),围坐一圈,现从指定的第一个人从 1 开始报数,数到第m个人时出列,然后从出列的下一个人重新开始报数,数到第m个人又出列,……,如此重复,直到剩余 1 人为止。
要求:用单向循环链表实现,输出出列人的编号和最后剩余人的编号。

#include <stdio.h>
#include <stdlib.h>
typedef struct list
{
int num;
struct list* next;
}*listNode;
listNode initList(int num)
{
listNode head, p;
int i;
head = (listNode)malloc(sizeof(list));
p = head;
head->num = 1;
head->next = NULL;
for(i = 2; i <= num; i++)
{
listNode tmp;
tmp = (listNode)malloc(sizeof(list));
tmp->num = i;
tmp->next = NULL;
p->next = tmp;
p = p->next;
}
p->next = head;
return head;
}
void main()
{
int n, m, i;
listNode pList;
printf("n = ");
scanf("%d", &n);
printf("m = ");
scanf("%d", &m);
pList = initList(n);
for(i = 0; i < n; i++)
{
int j = 1;
listNode tmp;
while(j++ < m - 1)
pList = pList->next;
tmp = pList->next;
pList->next = tmp->next;
pList = pList->next;
printf(" %d : %d\n", i+1, tmp->num);
free(tmp);
}
while(1);
}追问

怎么单独输出要求中说的最后剩余人编号?比方我输入12和4,输出应该是
出列人编号:4 ,8 ,12 ,5 ,10,3,11,7,6,9,2
最后剩余人的编号: 1

追答

稍微改动了下main函数
void main()
{
int n, m, i;
listNode pList;
printf("n = ");
scanf("%d", &n);
printf("m = ");
scanf("%d", &m);
pList = initList(n);
for(i = 0; i next;
tmp = pList->next;
pList->next = tmp->next;
pList = pList->next;
printf(" %d : %d\n", i+1, tmp->num);
free(tmp);
}
printf("last one is %d", pList->num);
free(pList);
while(1);
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-09-27
你写一个循环链,就行了

用c语言实现约瑟夫环
正好之前写过基础的约瑟夫环,稍作修改就可以满足你的题目 include <stdio.h>#include <stdlib.h>typedef struct _node { int id; int key; struct _node *next;} Linklist;int main() {int n, m;scanf("%d %d", &n, &m);int i, count = 0;Linklist *head = (Linklist*...

数据结构中的约瑟夫环问题用C语言怎么编写出来啊?
1. 程序分析:这是一个比较经典的算法--约瑟夫环问题.2.个人分析: 算法比较经典,对于这样的问题本应该使用链表的形式会比较容易.约瑟夫环算法 则体现了使用数组来完成链表该完成的功能,虽然形式上完全不相同,但却求出了 相同的结果.有异曲同工之妙.总之我个人认为是数组中非常经典的算法了.希望本 ...

约瑟夫环问题怎么解决啊?请用C语言写代码,谢谢!
include"MyNode.h" \/\/文件1 Node::Node( ){ next = NULL;} Node::Node(Node_entry item, Node *add_on){ entry = item;next = add_on;} --- include<iostream.h> \/\/文件2 typedef int Node_entry;struct Node { \/\/ data members Node_entry entry;Node *next;\/\/ constructor...

求助, 约瑟夫环问题(C语言)
do{ i=0;\/\/避免m减一后为零的问题 while(i!=m){ q=q->next;i++;} p=q->next;q->next=p->next;printf(" %d",p->num);m=p->val;\/\/你少了这一步。m=m-1;\/\/提前使q停下,p=q->next,p就是目标。free(p);}while(q->next!=q);printf(" %d\\n",q->num);free(q...

约瑟夫环(单向循环链表)_C语言「抄作业」
直到最后剩下2人。最终,Josephus与另一人分别位于第16和第31的位置上。示例输出 在C语言抄作业系列中,提供了关于约瑟夫环问题的代码实现。该实现旨在解决Josephus与另一人最初位次的计算问题。作为一个计算机科学专业毕业多年后转行至产品经理的人,从当年的作业中搜集了这部分代码,供参考。

求用循环队列解决约瑟夫环问题的C语言代码,急,速度!!!
void Fmade(int x, int y, int z);void main(){ int a, b, c;\/\/t i, j, k;\/\/t aa[100], b[100];cout<<"请输入总人数:";cin>>a;cout<<endl<<"请输入开始位子:";cin>>b;cout<<endl<<"请输入步长:";cin>>c;Fmade(a, b, c);} void Fmade(int x, int y, ...

C语言做约瑟夫环问题要注意哪些问题
1,查找到的位置,要做标记,以便下次不会再重复。删除或是移出队列 2,查找到最后的一个位置后,要从开始再计数。注意不能超越下标,或是访问非法结点。3,有多个元素(X),就要循环X-1次,以保证最后结果个数的正确性。

用C语言解决一个实际问题(不要太长)
约瑟夫环(很有名的数学问题)已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。void JOSEPHUS(int n,int k,int m) \/\/n为总人数,k...

数据结构课程设计《报数游戏》队列问题 c语言
约瑟夫环问题:如果你用队列做的话,设一个计数器,如果计数器<m就出队后再入队,等于m时那个元素只出队不入队,输出这个元素并且让m等于0。循环到队列为空就行了。

约瑟夫游戏问题
写完密码约瑟夫就想到原来看到约瑟夫问题的一个数学解法 很巧妙很简单 不过只能推出最后一个出列的人 无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。我们注意到原...

相似回答