约瑟夫问题:
传说在公元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);
}
输入结果如下: