您现在的位置是:结局

约瑟夫图片,约瑟夫问题:M个人围成一圈,从第一个人开始依次从1

2020-11-09 13:31结局

简介代本:#include "stdio.h"#include struct s{ char x; struct s *next;};void dellink(struct s *p) 约瑟夫问题:M个人围成一圈,从第一个人开始依次从1到N循环报数,每当报数为N时此人出圈,直到剩一人为止...

代本:

#include "stdio.h"

#include <stdlib.h>

struct s{

char x;

struct s *next;

};

void dellink(struct s *p){

struct s *q,*t;

for(t=p,q=p->next;q!=t;q=q->next){//释放链表

free(p);

p=q;

}

}

int main(int argc,char *argv[]){

struct s *p,*head;

int n,m,i,k,t;

printf("Enter n, m(int n,m>0)...\n");

if(scanf("%d%d",&n,&m)==2 && m>0 && n>0){//输人数数间隔

if((p=head=(struct s *)malloc(sizeof(struct s)))==NULL){//申请空间

printf("Application memory failure, exit...\n");//申请失败则退出

return 0;

}

for(p->next=head,p->x=i=1;i<n;i++){//链表结点置1并构成环链表

if(p->next=(struct s *)malloc(sizeof(struct s))){

p=p->next;

p->x=1;

p->next=head;//构成环链表就把最后结点的下一结点设为第一个结点

}

else{//若某结点申请失败则释放已申请结点并退出

printf("Application memory failure, exit...\n");

dellink(head);//释放已申请结点

return 0;

}

}

for(i=1,t=k=0,p=head;k<n;p=p->next,++t)//按题设次序对前n个结点清0

if(p->x && i++%m==0)

p->x=0,k++;

printf("%d\n",t%n);//输出最后清0的编号

dellink(head);//释放整个链表

return 0;

}

else

printf("Input error, exit...\n");

return 0;

}

-

下面是更多关于约瑟夫图片的问答

约瑟夫问题 设有N个人围坐一圈,现从某人开始报数, 数到M的人出列,接着从出列的下一个人重新报数,数到M的人又出列,如此下去直到所有人都出列为止,试给... 让你用程序实现过程就好了吗,管他要求啥 #include "stdio.h"

#define M 65

int main()

{

int i,k,n,m,count;

int name[M];

scanf ("%d %d",&n,&m);// n个人

for (i = 0;i < n;i ++)//编号

{

name[i]= i +1;

}

k = 0;

for (i = 0;i < n;i ++)

{

count = 0;

while (count < m) //每到m个人入

{

while (name[k] == 0)

k = (k + 1)%n;

count ++;

k = (k + 1)%n;

}

k --;

if (k < 0)

k = n-1;

printf ("%d\n",name[k]);

name[k] = 0;

}

return 0;

}

哪里不明白,就来啊 #include<iostream>

using namespace std;

#define TRUE 1

#define FALSE 0

#define OK 1

typedef int Status;

typedef double ElemType;

//-----------------------------------

//单向链

typedef struct LNode

{

int number;

int data;

struct LNode *next;

}LNode, *LinkList;

//-----------------------------------

LinkList EvaluList(int n);//对单向循环链表进行尾插入赋值

int size(LinkList L);//求链表的个数

Status ScanList(LinkList L);//遍历单向循环链表

Status Joseph(LinkList &L,int m);//约瑟夫环的实现 本回答被网友采纳 #include <iostream>

using namespace std;

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

struct player{ //定义一个成员结构

int num; //编号

int key; //密码

player *next; //指向下一个player节点的指针

};

player *circle(player *,int &m); //创建一个单循环链表的函数

void begin_to_count(player *,player *,int); //运算和输出函数

void Q(); //问题描述的函数

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

void main(){

int start_key;

player *head;

player *last;

last=NULL;

head=new player;

Q();

last=circle (head,start_key);

begin_to_count(head,last,start_key);

return;

}

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

player *circle(player *head, int &start_key){ //从键盘读入数据 并建立单循环链表函数

int m,i;

player *p,*Last;

p=head;

cout<<"请输入人数"<<ends;

cin>>m;

cout<<"请输入这"<<m<<"个人的密码(用空格隔开)"<<endl;

for (i=0;i<m;i++)

{

p->num=i+1;

cin>>p->key;

Last=p;

p->next=new player;

p=p->next;

}

delete p;

Last->next=head;

cout<<"请输入初始密码"<<ends;

cin>>start_key;

return Last;

}

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

void begin_to_count(player *head,player *last,int m){ //输出函数

player *P;

int i;

cout<<"输出序列为:"<<ends;

while (head->next!=head)

{

for (i=1;i<m;i++)

{

last=head;

head=head->next;

}

P=head;

m=head->key;

cout<<P->num<<ends;

head=head->next;

last->next=head;

delete P;

}

if (head->next==head){

cout<<head->num<<endl;

delete head;

}

// else

// begin_to_count(head,last,i);

return;

}

void Q(){ //打印约瑟夫环信息的函数

cout<<" ==============约瑟夫环==========="<<endl

<<endl

<<"约瑟夫(Joseph)问题的一种描述是:"<<endl

<<"编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人持有一个密码(正整数)。"

<<"一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报"

<<"到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始"

<<"重新从1报数,如此下去,直到所有人全部出列为止。"<<endl

<<endl;

} 约瑟夫(Joeph)问题的一种描述是:为1,2,…,n的n个人按顺时针围坐一圈,每人持有一个密码(正整数一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。

1.需求分析和说明

分析约瑟夫问题:n个人围成圈,每人各持一个密码,任选一个正整数作为报数上限值m,从第一个人开始,数到第m个人,删除并以出列者密码作为新的m值,从下一个人开始进行第二轮操作,直到所有人都出列。例如n=6, m=3, 处理过程下图。

2.设计

n个人围圈,形成线性关系;处理为逐个删除,故用链式结构合适;又人员围成圆圈,所以此链式结构采用循环方式较好;排号按照一个方向进行,故数据结构采用带头结点的单向循环链表。假设人员以首次的编号命名,对每个人员采用编号和密码加以描述。利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。

存储结构:

typedef struct Node

{

ElemType date; //编号

int mima; //密码

struct Node *next;

}Node,*LinkList;

单向循环链表:

LinkList H; //表头指针

Node *Q,*Pre;//*Q指新建结点,*pre指向当前工作结点

Q=(Node*)malloc(sizeof(Node));

构造函数:

void InitList(LinkList *H); //初始化循环链表

void InPut(LinkList H,int *A);//插入结点

void DelList(LinkList H,int *x, int*a); //删除结点 #include<iostream.h>

struct Node

{

int data;

Node *pNext;

};

void main()

{

int n,k,m,i;

Node *p,*q,*head;

cout<<"输入n:";

cin>>n;

cout<<"输入起始报数人k的值:";

cin>>k;

cout<<"输入 数到m出列的m的值:";

cin>>m; 本回答被网友采纳

Tags:约瑟夫图片,C语言:n人围圈m报数的约瑟夫老题,要求见图片,