美文网首页
1.4 循环链表实现Joseph环

1.4 循环链表实现Joseph环

作者: 瓜尔佳Anthony | 来源:发表于2019-01-30 21:38 被阅读0次

约瑟夫环问题,是一个经典的循环链表问题,题意是:已知 n 个人(分别用编号 1,2,3,…,n 表示)围坐在一张圆桌周围,从编号为 k 的人开始顺时针报数,数到 m 的那个人出列;他的下一个人又从 1 开始,还是顺时针开始报数,数到 m 的那个人又出列;依次重复下去,直到圆桌上剩余一个人。

#include "stdafx.h"

typedef struct node {
    int number;
    struct node* next;
}person;

person * initLink(int n) {
    person *head = (person*)malloc(sizeof(person));
    head->number = 1;
    head->next = NULL;
    person *ring = head;
    for (int i = 2; i <= n; i++) {
        person * body = (person *)malloc(sizeof(person));
        body->number = i;
        body->next = NULL;
        ring->next = body;
        ring = ring->next;
    }
    ring->next = head;
    return head;
}

void findAndKick(person * head, int start, int kick) {
    person *tail = head;
    while (tail->next != head) {
        tail = tail->next;
    }
    person *p = head;
    while (p->number != start) {
        tail = p;
        p = p->next;
    }//p为需要删除的节点, tail为直接前驱
    while (p->next != p) {
        for (int i = 1; i < kick; i++) {
            tail = p;
            p = p->next;
        }
        tail->next = p->next;
        printf("the person with number:  %d is kicked out.\n", p->number);
        free(p);
        p = tail->next;
    }
    printf("the last person to be kicked out is number:  %d.\n", p->number);
    free(p);
}


int main() {
    printf("please enter the total number of persons:  ");
    int n;
    scanf("%d", &n);
    person * head = initLink(n);
    printf("the counting will start from number k( k>=1 and k<=%d):  ", n);
    int start;
    scanf_s("%d", &start);
    printf("the person counting m will be kicked out:  ");
    int kick;
    scanf_s("%d", &kick);

    findAndKick(head, start, kick);
    return 0;
}

相关文章

  • 1.4 循环链表实现Joseph环

    约瑟夫环问题,是一个经典的循环链表问题,题意是:已知 n 个人(分别用编号 1,2,3,…,n 表示)围坐在一张圆...

  • 线性表存储结构

    数组实现 结构体实现 带头结点的单循环链表 带头结点的双循环链表 带头结点 带头结点的单循环链表和双循环链表 不管...

  • 单链表 & 双链表& 单向循环链表的实现

    单链表 具体实现: 双链表 代码实现: 单向循环链表的实现 代码实现:

  • 29_循环链表

    关键词:循环链表的实现、约瑟夫环问题 1. 什么是循环链表? 概念上:任意数据元素都有一个前驱和一个后继所有的数据...

  • python 循环单向链表

    单向循环链表python实现 循环链表实现 头节点添加 尾节点添加 插入 删除 查找

  • 学习数据结构第一弹 线性表(5)

    循环链表与双向链表 循环链表: 循环链表也是一种线性表的链式存储结构,其实他和单链表很像,其特点是它是一个环,也就...

  • 10.单向循环链表SingleCycleLinkList

    目录:1.单向循环链表的定义2.单向循环链表的图解3.单向循环链表定义操作4.单向循环链表的实现 1.单向循环链表...

  • 链表翻转

    单链表 递归实现 循环实现

  • 算法面经---单向循环链表(解决约瑟夫问题)

    单向循环链表--解决约瑟夫问题 一、单向循环链表的应用场景 1.1 问题描述 Josephu(约瑟夫、约瑟夫环) ...

  • 单向循环链表

    单向循环链表 循环链表顾名思义就是链表是循环的,最后一个节点的next指向首元节点,从而形成一个环.如图 单向循环...

网友评论

      本文标题:1.4 循环链表实现Joseph环

      本文链接:https://www.haomeiwen.com/subject/zhchsqtx.html