C語言 約瑟夫問題

2021-10-19 15:20:47 字數 2630 閱讀 4742

題目中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報數,如此下去,直到所有人全部出列為止。...