简单约瑟夫环的实现,主要使用链表
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef struct Node{
int id; // 编号
int password; //密码
Node *next; //指针域
}Node;
Status Greate(int n,int *pass_word,int m){
int i;
Node *head;
Node *rear;
for(i = 1; i <= n;i++){
Node *s = (Node *)malloc(sizeof(Node));
s->id = i;
s->password = pass_word[i];
if(i == 1){
head = s;
rear = s;}else{
rear->next =s;
rear = s;
}
}
rear->next = head;
Node *p = head;
Node *pre = rear;
while(p->next !=p){
for(i = 1;i <m; i++){
pre = p; p = p->next;
}
printf("%d ",p->id);
m = p -> password;
pre ->next = p->next;
free(p);
p = pre->next;
}
printf("%d\n",p->id);
free(p);
return OK;
}
int main(void){
int n,m;
printf("输入初始值密码。\n");
scanf("%d",&m);
printf("输入人数\n");
scanf("%d",&n);
printf("输入后面的人的密码\n");
int* pass_word = (int *)malloc(sizeof(int) * n); // m初始 n人数 密码信息(使用动态数组存贮)
for( int i = 1;i < n;i++)
scanf("%d",&pass_word[i]);
Greate(n,pass_word,m);
return 0;
}
调试: