网站建设资讯

NEWS

网站建设资讯

约瑟夫c语言用函数实现 约瑟夫问题c语言递归

约瑟夫问题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://njwzjz.com/article/doipppp.html