约瑟夫环(、循环链表三种方使用一维数组、一维结构体数组法完成

2025-04-15 06:49:38
推荐回答(1个)
回答1:

约瑟夫环:约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
***********************************************************************************************************************
一维数组:
#include   
#define M 10/*总人数*/   
#define N 5   
#define START 0/*第一个报数的人*/   
void main(void)   
{   int a[M],i=0,k,count=0;
  while(i++   a[i-1]=i;
  for(i=START;count<=M-1;count++)
  {   for(k=1;k<=N;a[i++]&&++k)/*根据&&运算的路短原理,若a[i]为0的话,++k的运算会被省略而++i的运算总会进行*/
   if(i>M-1)   i=0;
  printf("%d ",i?a[i-1]:a[M-1]);
  a[(i?(i-1):(M-1))]=0;
  }
  getch();
 }
***********************************************************************************************************************
一维结构体数组方式:
#include
#include
typedef struct node{
int value;
struct node *next;
}NODE;
NODE *createlink(int n){
NODE *head=NULL,*p=NULL,*q=NULL;
int i=1;
head=p=(struct node*)malloc(sizeof(struct node));
p->value=i;
for(i=2;i<=n;i++){
q=(struct node*)malloc(sizeof(struct node));
if(q==0) return 0;
p->next=q;
p=q;
p->value=i;
}
p->next=head;
return head;
}
void jose(NODE *p,int n,int m){
int i,j,g=0;
NODE *q=NULL;
for(i=1;i<=n;i++){
for(j=1;j p=p->next;}
q=p->next;
p->next=q->next;
if(g%5==0)
{g++;printf("\n");}
else g++;

printf("%3d:%3dout ",i,q->value-1);
free(q);
}
printf("\n");
p->next=NULL;
}
int main( ){
int m=0;
int n=0;
scanf("%d",&m);
scanf("%d",&n);
NODE *head=NULL;
head=createlink(n);
jose(head,n,m);
return 0;
}
***********************************************************************************************************************循环链表方式:
#include "stdio.h"
#include "stdlib.h"
#define S sizeof(struct node)

struct node
{
int num;
struct node *next;
};

typedef struct node NODE;

NODE *createlinklist(int n)
{
NODE *head,*p,*q;
int i=1;
head=p=(struct node*)malloc(sizeof(struct node));
p->num=i;
for(i=2;i<=n;i++)
{
q=(struct node*)malloc(sizeof(struct node));
if(q==0) return(0);
p->next=q;
p=q;
p->num=i;
}
p->next=head; /*使链表尾指向链表头 形成循环链表*/

return head;
}

void printlinklist(NODE *p,int n)
{
int i;
NODE *q = p;
if(NULL == q->next){
printf("the list is NULL!");
return;
}
printf("所有玩家的信息列表:\n");
for(i=1;i<=n;i++)
{
if(NULL == q){
printf("the list is NULL!");
return;
}
printf("%d ",p->num);
p=p->next;
}
printf("\n");
}

void joseph(NODE *p,int n,int m)
{
int i,j;
NODE *q;
for(i=1;i {
for(j=1;j<=m-1;j++)
{
p=p->next;
}
q=p->next;
p->next = q->next;
printf("%d ",q->num);
free(q);
}
printf("\n最后剩余的是第%d号.\n",p->num);
p->next=NULL;
}

void main()
{
NODE *head;
int n,m;
printf("请输入人数N:\n");
scanf("%d",&n);
printf("输入K:\n");
scanf("%d",&m);
head=createlinklist(n);
printlinklist(head,n);
printf("依次被选出的是:\n");
joseph(head,n,m);
}

***********************************************************************************************************************
我想我知道你是谁了。。。