C语言数据结构学习——循环链表实现约瑟夫环

#include <stdio.h>
#include <stdlib.h>

typedef struct SingleCycleLinkTable{
    int data;
    struct SingleCycleLinkTable * next;
}SingleCycleLinkTable;

SingleCycleLinkTable * initSingleCycleLinkTable(int n){
    SingleCycleLinkTable * head = (SingleCycleLinkTable*)malloc(sizeof(SingleCycleLinkTable));
    head->data = 0;
    head->next = NULL;
    SingleCycleLinkTable * temp = head;
    for(int i = 1;i <= n; i ++){
        SingleCycleLinkTable * body = (SingleCycleLinkTable*)malloc(sizeof(SingleCycleLinkTable));
        body->data = i;
        body->next = NULL;
        temp->next = body;
        temp = temp->next;
    }
    temp->next = head;
    return head;
}

void findAndKillK(SingleCycleLinkTable * head, int k, int m){
    SingleCycleLinkTable * tail = head;
    while(tail->next != head){
        tail = tail->next;
    }
    SingleCycleLinkTable * p = head;
    while(p->data != k){
        tail = p;
        p = p->next;
    }
    while(p->next != p){
        for(int i = 1;i < m; i ++){
            tail = p;
            p = p->next;
        }
        tail->next = p->next;
        printf("outer number is : %d\n", p->data);
        free(p);
        p=tail->next;
    }
    printf("outer number is : %d\n", p->data);
    free(p);
}

int main(){
    printf("input disk person number: ");
    int n;
    scanf("%d", &n);
    SingleCycleLinkTable * head = initSingleCycleLinkTable(n);
    printf("call number from k(k>1&&k<%d):", n);
    int k;
    scanf("%d", &k);
    printf("out the line which call m:");
    int m;
    scanf("%d", &m);
    findAndKillK(head, k, m);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值