问题概述
约瑟夫生死游戏 30个人围成一个圈由第一个人数起,依次报数,数到第九个人,便把他剔除,然后再从他的下一个人数起,数到第九个人,再将他剔除剩下15个乘客为止,问那些位置将是被扔下大海的位置。
vc++6.0环境下
文件名:
//main.cpp
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define TOTAL 30
#define INDEX 9
#define LEAVE 15
typedef struct node{
int data;
struct node *pnext;
}node,*pnode;
void create_list(pnode phead,int total){
pnode nn;
for(int i=1;i<total;i++){
if(i==1){
nn = (pnode)malloc(sizeof(node));
phead->pnext = nn;
phead->data = 1;
}
else{
pnode n = (pnode)malloc(sizeof(node));
nn->pnext = n;
nn->data = i;
nn = n;
nn->pnext = NULL;
}
}
nn->data = total;
nn->pnext = phead;
printf("\n");
}
void show_list(pnode phead){
pnode p = phead;
while(phead != p->pnext){
printf(" %d ",p->data);
p = p->pnext;
}
printf(" %d ",p->data);
}
void delete_node(pnode phead,int index,int delnum,int del[]){
int flag = 1;
int i = 0;
pnode p = phead;
pnode temp;
while(delnum>0){
show_list(phead);
printf("\n \n");
while(flag<index){
if(flag == index-1){
temp = p->pnext;
//free(p->pnext);
p->pnext = temp->pnext;
p = p->pnext;
flag = 1;
break;
}
else{
flag++;
p = p->pnext;
}
}
del[i] = temp->data;
i++;
phead = p;
delnum--;
}
free(temp);
printf("留下人的序号:\n");
show_list(phead);
}
void main()
{
int del[TOTAL-LEAVE];
pnode phead = (pnode)malloc(sizeof(node));
create_list(phead,TOTAL);
delete_node(phead,INDEX,TOTAL-LEAVE,del);
printf("\n\n\n掉海人的序号: \n");
for(int i=0;i<TOTAL-LEAVE;i++){
printf(" %d ",del[i]);
}
printf("\n");
//return 0;
}
使用codeblocks 开发环境
//main.cpp
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define TOTAL 30
#define INDEX 9
#define LEAVE 15
typedef struct node{
int data;
struct node *pnext;
}node,*pnode;
void create_list(pnode phead,int total){
pnode nn;
for(int i=1;i<total;i++){
if(i==1){
nn = (pnode)malloc(sizeof(node));
phead->pnext = nn;
phead->data = 1;
}
else{
pnode n = (pnode)malloc(sizeof(node));
nn->pnext = n;
nn->data = i;
nn = n;
nn->pnext = NULL;
}
}
nn->data = total;
nn->pnext = phead;
printf("\n");
}
void show_list(pnode phead){
pnode p = phead;
while(phead != p->pnext){
printf(" %d ",p->data);
p = p->pnext;
}
printf(" %d ",p->data);
//printf("\n-- %d --",p->pnext->data);
}
void delete_node(pnode phead,int index,int delnum,int del[]){
int flag = 1;
int i = 0;
pnode p = phead;
pnode temp;
while(delnum>0){
show_list(phead);
printf("\n \n");
while(flag<index){
if(flag == index-1){
temp = p->pnext;
//free(p->pnext);
p->pnext = temp->pnext;
p = p->pnext;
flag = 1;
break;
}
else{
flag++;
p = p->pnext;
}
}
del[i] = temp->data;
i++;
phead = p;
delnum--;
}
printf("留下人的序号:\n");
show_list(phead);
}
int main()
{
int del[TOTAL-LEAVE]={};
pnode phead = (pnode)malloc(sizeof(node));
create_list(phead,TOTAL);
delete_node(phead,INDEX,TOTAL-LEAVE,del);
printf("\n\n\n掉海人的序号: \n");
for(int i=0;i<TOTAL-LEAVE;i++){
printf(" %d ",del[i]);
}
printf("\n");
return 0;
}