C语言课程设计-约瑟夫环

/*15个教徒和15个非教徒在深海遇险,必须将一半人投入海中 
30个人围成一圈,从第一个人开始报数,每数到第9个人就将他
扔入大海,如此循环直到剩余15个人为止。怎样排法才能使每次
投入大海的都是非教徒。 
*/
/*思路:建立一个30个结点的循环链表,结点值域是该结点的序号,
从头结点开始计数遍历,每次数到9,记下该节点的序号,并删除该
节点,循环数9记录删除操作,直到删完15个结点为止,最终记录下
来的序号就是该放教徒的地方 
*/
/*双链表的建立:从head即i = 1存储n个数,村到最后令cu->linknext=head
但是输出是要注意条件cu->linknext!=head,cu->linknext=head需要单独输出 
*/




#include<stdio.h> 
#include<stdlib.h>
#include<string.h>
#include<malloc.h>


struct node{
int out;//被投入海的标记(1:没有被人下海。 0:已被人下海) 
struct node * nextlink;//指向下一个人的指针(下一个人的数组下标) 
};
typedef struct node NODE;
typedef struct node * NODEPTR;




int main(){
int n = 30;
int i = 0,j = 1,k = 0;
int c=0 ,count=0;
//int * p;

NODEPTR head = NULL;
NODEPTR cu = NULL;
NODEPTR tmp = NULL;
for(i = 0;i < n;i++){
tmp = (NODEPTR)malloc(sizeof(NODE));
tmp->out = 1;
if(i == 0){
head = tmp;
cu = head;
}
else{
cu->nextlink = tmp;
cu = tmp;
}
 
}
cu->nextlink = head;

 
 
 
  for(cu = head;count<=15;cu = cu->nextlink){
  k++;
  if(cu->out == 1){
  c++;
  // k++;
}
if(c == 9){
cu->out = 0;
count++;
if(k != 30){
printf("%d 被人扔下。\n",k%30);
}
else if(k ==15 ){
printf("%d 被人扔下。\n",n);
}
c = 0;
// k++; 
}
 
}
 

/* printf("被扔下海的人的位置是:\n");
for(cu = head ;cu->nextlink!=head;cu = cu->nextlink){
if(cu->out == 0)
printf("%d ",);
}
if(cu->nextlink == head){
if(cu->out == 0)
printf("%d ",);
}*/
return 0;

发布了17 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_33360009/article/details/75125937