約瑟夫問題:
傳說在公元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);
}
輸入結果如下: