鏈表的小應用-約瑟夫問題

約瑟夫問題:

傳說在公元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);

}

輸入結果如下:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章