编辑代码

#include <stdio.h>
#include<stdlib.h>
struct Node {
    int number;
    int code;
    struct Node* next;
};
//合法性检查
void iflegal(int n,int k,int m){// n总人数 m初始密码 k初始位置
    if(n<=0){
        printf("请输入正整数的人数!");
        exit(0);
    }
    if(k<=0||k>n){
        printf("请在0到%d的范围内输入k的值!",n);
        exit (0);
    }
    if(m<=0){
        printf("初始密码需要大于0!");
        exit (0);
    }
}
//创建循环链表函数 n为总人数 返回尾结点
struct Node* creatlist(int n) { 
    printf("请依次输入各个人的各自密码,用回车键分开或用空格隔开在一行输入\n");
    int a,b;//a存储密码b作输入合法性检查用
    b=scanf("%d",&a);    
    if (b != 1) {//各自密码输入的合法性检查
        printf("请输入正确格式!\n");
        exit(0);
    }
    if (a <= 0) {
        printf("请输入正整数!");
        exit(0);
    }
    struct Node* p;
    struct Node* q;
    p = (struct Node*)malloc(sizeof(struct Node));
    if (p == NULL) {
        printf("内存分配失败!");
    }
    q = p; //q结点标记最后一个结点

    p->number = 1;//首结点标记1
    p->code=a;
    struct Node* o;
    //循环赋值号码,首节点已标记,每个结点标记m+1
    if(n>1){ 
     for (int m = 1; m < n; m++) { 
         b=scanf("%d", &a);

            if (b != 1) {//各自密码输入的合法性检查
             printf("请输入正确格式!\n");
                exit(0);
            }
            if (a <= 0) {
                printf("请输入正整数!");
                exit(0);        
            }
            o = (struct Node*)malloc(sizeof(struct Node));//每个结点都分配空间
            o->number = m + 1; 
            o->code = a;
            q->next = o;
            q = o;
            if(m==n-1){
                printf("\n\t循环开始!\n");
            }
        }
        o->next = p;//尾结点和首结点连接
        return o;//返回最后一个结点,保证之后的循环到要淘汰之前一个结点停止
     }
     else if(n==1){
         printf("\n\t循环开始!\n");
         return p;
     }
}


int main() {
    int n, m,k,i,j;// n总人数 m初始密码 k初始位置
    struct Node* p, * q;//p标记要删除结点前一个结点 q作删除结点用
    printf("请输入总人数:");
    if(!scanf("%d",&n)){
        printf("请输入正确格式的数字!");
        return -1;
    }
    printf("请输入初始开始位置(0<k<=%d):",n);
    if(!scanf("%d",&k)){
        printf("请输入正确格式的数字!");
        return -1;
    }
    printf("请输入初始密码:");
    if(!scanf("%d",&m)){
        printf("请输入正确格式的数字!");
        return -1;
    }
    iflegal(n,k,m);//合法性检查
    p = creatlist(n);//p标记尾结点
    // 后移k-1位
    if(n==1){
        printf("%d",p->number);
        return 0;
    }
    if(k>1){
        for(i=1;i<k;i++){
            p=p->next;
        }
    }
    for ( i = 1; i <= n; i++) {
        //循环找到要淘汰的号码的前一个号码
        for ( j = 1; j < m; j++) {
            p = p->next;//p标记要删除结点前一个结点
        }
        q = p->next;
        m = q->code;
        printf("%d\n", q->number);
        p->next = q->next;
        free(q);
    }
    return 0;
}