php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 594|回复: 0

c语言约瑟夫生死游戏

[复制链接]

3138

主题

3148

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
7946
贡献
0
注册时间
2021-4-14
最后登录
2024-11-21
在线时间
763 小时
QQ
发表于 2022-5-28 20:06:18 | 显示全部楼层 |阅读模式
[mw_shl_code=c,true]#include<stdio.h>
#include<stdlib.h>
/* 定义单链表节点类型 */
typedef struct node{        
        int ser_num;
        struct node * next;
}linklist;

linklist * Init(int n){  
        //n为单向链表的节点数,human_list为单向链表指针
        linklist *p,*q,*human_list;
    int i;
    q=(linklist *)malloc(sizeof(linklist));  
        human_list = q;
    for(i=1;i<n;i++){   //初始化单向链表 ,从1-n开始编号。                        
        p=(linklist *)malloc(sizeof(linklist));
        q->ser_num=i;
        q->next=p;
        q=p;
    }
    q->ser_num=n;
    p->next=human_list;
        human_list=q->next;                                      
    return human_list;  //此时human_list指向链表的第一个位置
}

void printf_List(int num,linklist *human_list){  //将幸存的人的编号输出
        int i;
        for(i=0;i<num;i++){//初始化遍历输出
                printf("%6d",human_list->ser_num);
                human_list = human_list->next;
        }
}

//扔人下船至剩余k人
linklist * Delete(int huamn_num,int begin_num,int sersidue_num,int k,linklist * human_list){
        int i;
        linklist *p,*q;//p循环,q记录
        p = human_list;//起始1
        q=p;
        for(i=0;i<huamn_num-1;i++){
                q=q->next;
        }
        //q=q->next;     //起始human_num
        for(i=0;i<begin_num-1;i++){
                p = p->next;
                q = q->next;
        }
        printf("\n\n扔下的人的序号:\n");
        printf("%6d",p->ser_num);
        q->next=p->next;
        p=p->next;
        for(;huamn_num-1>k;huamn_num--){
                for(i=0;i<sersidue_num-1;i++){
                        p = p->next;
                        q = q->next;
                }
                printf("%6d",p->ser_num);
                q->next=p->next;
                p=p->next;
        }
        p=q;
        for(i=0;i<k;i++){
                p=p->ser_num<q->ser_num?p:q;
                q=q->next;
        }
        human_list=p;
        return human_list;
}

//human_num      总人数
//sersidue_num   间隔数
//k              可剩余人数
//begin_num      开始序号
int  main(){
        int human_num,sersidue_num,k,begin_num,i;
        linklist * human_list;
    printf("总人数n: ");
        scanf("%d",&human_num);
        printf("选择第一个扔下船的序号j: ");
        scanf("%d",&begin_num);
        printf("选择扔下船的间隔数m: ");
        scanf("%d",&sersidue_num);
        printf("可幸存人数k: ");
        scanf("%d",&k);
        human_list = Init(human_num);
        printf("\n\n总人数遍历结果:\n");
        printf_List(human_num,human_list);
        human_list = Delete(human_num,begin_num,sersidue_num,k,human_list);
        printf("\n\n幸存的人的序号:\n");
        printf_List(k,human_list);
        getch();
}
[/mw_shl_code]

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-11-22 03:11 , Processed in 0.303860 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表