首页 > 编程语言 > 详细

约瑟夫环C语言实现

时间:2020-05-16 09:58:14      阅读:35      评论:0      收藏:0      [点我收藏+]

约瑟夫环实现:

// 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("初始化链表错误!\n");
        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号\n", q->Num);
        free(q);
    }
    return p;
}

//遍历
void print_list(Head h, uint M) {
    int i = 0;
    PNode p = h;
    printf("参与的人的编号为:\n");
    while (i++ < M) {
        printf("%d ", p->Num);
        p = p->next;
    }
    printf("\n");
}

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("\n\n获胜者为:%3d号\n", r->Num);

    return 0;
}

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

约瑟夫环C语言实现

原文:https://www.cnblogs.com/areful/p/12898570.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!