題目中30個人圍成一圈,因而啟發我們用乙個迴圈的鏈來表示,可以使用結構陣列來構成乙個迴圈鏈。結構中有兩個成員,其一為指向下乙個人的指標,以構成環形的鏈;其二為該人是否被扔下海的標記,為1表示還在船上。從第乙個人開始對還未扔下海的人進行計數,每數到9時,將結構中的標記改為0,表示該人已被扔下海了。這樣迴圈計數直到有15個人被扔下海為止。
建立節點結構體
// an highlighted block
typedef struct person
person,
* p_person;
插入節點
void
insert_person
(p_person l
, int a)
//第乙個引數是指向第乙個節點的指標,第二個引數是插入節點的資料域
p->next = ptr;
size++
;//節點個數
}
這裡做了開鎖和關鎖兩個函式,分別表示迴圈鍊錶變單向鍊錶和單向鍊錶變迴圈鍊錶
//關鎖
void
close_list
(p_person l
) p-
>next =l-
>next;
}//開鎖
void
open_list
(p_person l
) p-
>next =
null
;}
void
print
(p_person l
) p = p-
>next;
}}
void
joseph
(p_person l
,int a)
//a表示迴圈基數
p_person p =l-
>next;
//p去獲取要刪除節點之前的節點位址,用p去儲存
while
(p->next != ptr)
if(p-
>next ==l-
>next)
//判斷刪除的節點是否是頭指標指向的節點,如果是就把頭指標賦值為第二個節點
p->next = p-
>next-
>next;
//刪除節點
ptr = p-
>next;
//讓下次數數的時候從刪除後的乙個節點開始
size--
;//節點數減一
print(l
);//列印節點
printf
("\n");
}}
#include
#include
#define person_size 10
//一圈總節點數
#define base_size 3
//迴圈基數
int size;
//當前人數
typedef struct person
person,
* p_person;
//插入人數
void
insert_person
(p_person l
, int a)
p->next = ptr; size++;}
//關鎖
void
close_list
(p_person l
) p-
>next =l-
>next;
}//開鎖
void
open_list
(p_person l
) p-
>next =
null;}
//列印
void
print
(p_person l
) p = p-
>next;}}
//輪迴制
void
joseph
(p_person l
,int a)
p_person p =l-
>next;
while
(p->next != ptr)
if(p-
>next ==l-
>next)
//p_person pt=ptr;
p->next = p-
>next-
>next;
ptr = p-
>next;
size--
;//free(pt);
print(l
);printf
("\n");
}}int main()
close_list(&
l);joseph(&
l,4)
;return0;
}
關於鍊錶的所有操作都是對next的操作。主要刪除和新增節點,這些改變鍊錶節點數的操作都是要->next=「新增的節點指標或者->next->next」。要明確每個指標指向的地方,不然容易搞錯。
為啥我用free函式釋放記憶體的時候會有問題釋放不了。
C語言 約瑟夫問題
維基百科說明 約瑟夫問題 有時也稱為約瑟夫斯置換 是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。人們站在乙個等待被處決的圈子裡。計數從圓圈中的指定點開始,並沿指定方向圍繞圓圈進行。在跳過指定數量的人之後,執行下乙個人。對剩下的人重複該過程,從下乙個人開始,朝...
約瑟夫環問題(C語言)
n個人站成一圈,每個人有不同的編號i,從編號為1的人開始順時針防線迴圈報數,數到m的人出列。然後從出列者的下乙個人重新報數,如此重複,直到全部出列。輸出n個人的出列順序。元素位置標記為0,1,2,n 1。設t為輸出元素位置,初始值0,則輸出元素位置為t t m 1 n t位置後的元素後移,列表元素個...
約瑟夫環問題 C語言
問題描述 編號是1,2,n的n個人按照順時針方向圍坐一圈,每個人只有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個仍開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向的下乙個人開始重新從1報數,如此下去,直到所有人全部出列為止。...