约瑟夫问题c语言实现代码
测试结果:
目前创新互联已为上千多家的企业提供了网站建设、域名、虚拟主机、网站托管、服务器租用、企业网站设计、临西网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
总人数n=9,报数m=2.
2-4-6-8-1-5-9-7-3
#includestdio.h
#includestdlib.h
typedef struct node
{
int data;
struct node *next;
}node;
typedef node* Linklist;
//原代码void CreatLinklist( Linklist *L,int n)
Linklist CreatLinklist(Linklist *L,int n)
{
Linklist p,s;
*L=(Linklist)malloc(sizeof(node));
(*L)-next=NULL;
int i=1;
p=*L; //增加这个语句,让p指向当前结点
if(n!=0)
{
//原代码while(i=41)
while(i=n)
{
s=(Linklist)malloc(sizeof(node));
s-data = i++;
p-next = s;
p=s;
}
s-next=(*L)-next;//将链表循环起来;
}
free(*L);//释放头结点;
return s-next;//返回第一个结点的值;
}
int main()
{
int n=41; //9
int m=3; //2
int i;
Linklist L;
printf("总人数n=%d,报数m=%d.\n",n,m);
//原代码Linklist *p = CreatLinklist(Linklist *L,int n);
Linklist p = CreatLinklist(L,n);
Linklist temp;
m%=n;
while(p!=p-next)
{
for(i=1;im-1;i++)
{
p=p-next;
}
printf("%d-",p-next-data);
temp=p-next;
p-next=temp-next;
free(temp);
p=p-next;
}
printf("%d",p-data);
return 0;
}
按要求用C语言写约瑟夫环
这没啥高手的,人称入门题目,也就是说,会做这个基本就可以用C做一些东西了。这是我以前写的,从博客上面搞下来的,你试试看能不能运行,我当时似乎是运行过了的。不过这个不是用链表做的,用数组做的,你结合链表的语法把他改一下就行了,很简单的,就一个结构体而已么,反正基本思路这样就对了。另外对了,当时水平有限还不懂动态分配内存,你去查一下malloc函数的用法,觉得合适可以加进去,你用new命令也可以动态分配内存,具体的可以去看看MSDN,MSDN好东西啊。
#includestdio.h
#includestdlib.h
void main()
{
int a[100]; /*用来放环里的每个人的,人口上限(好像在打魔兽争霸)100,当然可以再改大*/
int n,r,ctor,u; /*n是用来循环赋值的,给r个人循环赋1~u,一共r个人,ctor计数器,到了u再重新归1*/
int call(int a[],int real,int u); /*报数函数*/
for(n=0;n=99;n++)a[n]=0; /*给所有元素赋值为0,这样以后没赋值1~u的就都为0,可以当作不存在*/
printf("/约瑟夫环 JOSEPHUS/\n\n");
printf("输入参与报数的人数\n");
scanf("%d",r);
printf("输入报数上限\n");
scanf("%d",u);
ctor=1;
for(n=0;nr;n++) /*这个循环里给输入的人数都赋值,从1到u,相当于报的数*/
{
*(a+n)=ctor;
ctor++;
if(ctoru)ctor=1;
}
call(a,r,u);system("pause"); /*调用点名函数*/
}
int call(int a[],int real,int u)
{
int n1,i;
int *p;
p=(a+u-1);
n1=0;i=u;
for(;n1real-1;p++)
{
if(p(a+real-1))p=a; /*如果点名点过了,就接着队伍没有出列的第一个人继续*/
if(*(p)!=0) /*如果扫描的数字不为零,说明这个人还在队列中,那么看下面*/
{
if(iu)i=1; /*由于是剩下的人继续报数,所以当报到u这个上限时,还是要从新归1*/
if(i==u) /*当到达上限,说明这个人该出列啦,它的位置就填充为0*/
{
*(p)=0;n1++; /*n1计算着一共多少人出列,通过n1real-1,可以留下最后一个人,这是最终目的*/
}
i++;
}
}
for(i=0;ireal;i++) /*从新扫描数组,发现不是0的就输出,到这时候肯定只剩一个数不是0了*/
if(*(a+i)!=0)printf("所剩最后一位原来的呼号是%d\n\n",i+1);
}
写完了
用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*)malloc(sizeof(Linklist)), *tail = head;
head-id = 1;
scanf("%d", head-key);
head-next = head;
for(i = 2; i = n; i++) {
Linklist *p = (Linklist*)malloc(sizeof(Linklist));
p-id = i;
scanf("%d", p-key);
p-next = head;
tail-next = p;
tail = p;
}
while(head != tail) {
if(++count % m) {
tail = head;
} else {
m = head-key;
count = 0;
printf("%d ", head-id);
tail-next = head-next;
free(head);
}
head = tail-next;
}
printf("%d\n", head-id);
free(head);
return 0;
}
文章名称:约瑟夫c语言用函数实现 约瑟夫问题c语言递归
分享地址:http://scgulin.cn/article/doipppp.html