admin 发表于 2022-5-28 20:06:18

c语言约瑟夫生死游戏

#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      开始序号
intmain(){
        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();
}
页: [1]
查看完整版本: c语言约瑟夫生死游戏