zoukankan      html  css  js  c++  java
  • 约瑟夫环C语言实现

    约瑟夫环实现:

    // use C99 
    #include <stdio.h>
    #include <malloc.h>
    
    #define uint unsigned int
    
    //构建结构体
    typedef struct Node {
        uint Num;
        struct Node *next;
    } JoseNode, *PNode, *Head;
    
    //初始化循环单链表
    Head init_head() {
        Head h = (Head) malloc(sizeof(JoseNode));
        if (!h) {
            printf("初始化链表错误!
    ");
            return 0;
        }
        h->next = h;
        return h;
    }
    
    //单链表插入操作
    uint insert(PNode h, uint N) {
        PNode p = h, q;
        if (N == 1) {
            p->Num = 1;
            p->next = p;
            return 1;
        }
        for (int pos = 2; pos <= N; pos++) {
            p = p->next;
            q = (JoseNode *) malloc(sizeof(JoseNode));
            if (!q) {
                return 0;
            }
            q->Num = pos;
            q->next = p->next;
            p->next = q;
        }
        return 1;
    }
    
    //出局函数
    PNode delete(Head h, uint n, uint k) {
        PNode p = h, q;
        while (n-- > 1) {
            for (int i = 1; i < k - 1; i++) {
                p = p->next;
            }
    
            q = p->next;
            p->next = q->next;
            p = p->next;
    
            printf("出局的人为:%3d号
    ", q->Num);
            free(q);
        }
        return p;
    }
    
    //遍历
    void print_list(Head h, uint M) {
        int i = 0;
        PNode p = h;
        printf("参与的人的编号为:
    ");
        while (i++ < M) {
            printf("%d ", p->Num);
            p = p->next;
        }
        printf("
    ");
    }
    
    int main() {
        uint n = 0;//参与的人数
        uint k = 0;//报数密码
        while (n <= 1) {
            printf("请输入参与人数(大于1):");
            scanf("%d", &n);
        }
        while (k <= 1) {
            printf("请输入出局密码(大于1):");
            scanf("%d", &k);
        }
    
        Head h = init_head();
        insert(h, n);
        print_list(h, n);
    
        PNode r = delete(h, n, k);
        printf("
    
    获胜者为:%3d号
    ", r->Num);
    
        return 0;
    }
    

      参考:https://www.cnblogs.com/deom/p/4858010.html,此处对代码作了一定修改。

  • 相关阅读:
    简单SSM配置详解
    Nginx 简介
    序列化与反序列化
    用HttpSessionListener与HttpSessionBindingListener实现在线人数统计
    Linux
    jsp标签精华(持续更新中)
    ZooKeeper 编程(一)
    maven环境快速搭建
    Web项目--------原Oracle数据库的项目同时兼容MySql
    JavaMail实现邮箱之间发送邮件功能
  • 原文地址:https://www.cnblogs.com/areful/p/12898570.html
Copyright © 2011-2022 走看看