链表的小应用-约瑟夫问题

约瑟夫问题:

传说在公元1世纪的犹太战争中,犹太约瑟夫是公元一世纪著名的历史学家。在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人俘虏,于是决定了一个流传千古的自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报到第3人该人就必须自杀,然后再由下一个人重新报数,直到所有人都自杀身亡为止。然而约瑟夫和他的朋友并不想遵从这个约定,约瑟夫要他的朋友先假装遵从,他将朋友与自己安排在第_个和第_个位置,于是逃过了这场死亡游戏,你知道安排在了第几个嘛

针对以上问题,可用循环链表来求解,C代码如下

首先创建循环链表
typedef struct list_s{

int index;
struct list_s *next;

}list_t;

static list_t *creat_list(int num)
{

int i;
list_t *head,*tmp,*tail;
head = malloc(sizeof(list_t));
head->next = NULL;
tail = head;
for(i=1;i<=num;i++){
    tmp = malloc(sizeof(list_t));
    tmp->index = i;
    tail->next = tmp;
    tmp->next = head->next;
    tail = tmp;
}
return head;

}

每次删除第三个节点 删除到只剩2个节点h时,输出
static void delete_3(list_t *head)
{

list_t *tmp = NULL;
list_t *tmp1 = head->next;
list_t *tmp2 = tmp1->next;
list_t *tmp3 = tmp2->next;

printf("kill index is ");
while(tmp3 != tmp1){
    tmp = tmp3;
    printf(" %d", tmp3->index);
    tmp2->next = tmp3->next;
    
    tmp1 = tmp3->next;
    tmp2 = tmp1->next;
    tmp3 = tmp2->next;

    free(tmp);
}

printf("\nalive is %d %d \n", tmp1->index, tmp2->index);

}

输入结果如下:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值