C 自定義鍊錶實現約瑟夫環(2 1)

2021-08-09 06:58:33 字數 2092 閱讀 5601

鍊錶結構是一種動態儲存分配的結構形式,可以根據需要動態申請所需要的記憶體單元。

鍊錶結構主要分為單向鍊錶、雙向鍊錶、單迴圈鍊錶和多重迴圈鍊錶。其中,單向鍊錶中每個結點只包含乙個指標,該指標指向下乙個結點;雙向鍊錶中每個結點包含兩個指標,乙個指標指向下乙個結點,另乙個指標指向上乙個結點;單迴圈鍊錶中,最後乙個結點的指標指向第乙個結點,形成乙個迴圈;多重迴圈鍊錶中,結點鏈到了多個環上。

鍊錶結構帶來的最大好處是結點之間不要求連續存放,因此在儲存大流量資料時,不需要分配一塊連續的儲存空間。而鍊錶結構的缺點是浪費儲存空間,因為處理有用的資料部分之外,鍊錶中的結點還儲存了乙個指向下乙個結點的位址。另外,對於鍊錶的訪問只能從表頭逐個查詢,直到找到需要的結點,而不能進行隨機訪問。

約瑟夫環問題的描述為:編號為1,2,...n的n個人按順時針方向圍坐一圈,每人持乙個密碼(正整數)。任選乙個正整數作為起始數字m,從第乙個人開始按順序報數,報到m的人出列,將他持的密碼作為新的m,從他下乙個人(順時針)開始繼續報數,報到m的人出列,更新m值。如此下去,直到所有的人出列為止。

從以上分析可知,可以通過迴圈單向列表解決約瑟夫環的問題。首先,要定義表示每個人資訊的結點;接下來輸入每個人的資訊,並將這些資訊做成迴圈單向列表;然後再鍊錶中找到指定的人,最後將找到的資訊顯示出來。

從以上分析可知,每個人包含兩個資訊,乙個是在順時針圈中的索引號,另乙個是所持的密碼。因此,表示資訊的結構定義如下

typedef struct info;
其中,index表示索引號,code表示密碼。

typedef struct person *pperson;
其中,info_person表示本結點的資料;person_next表示下乙個結點的指標。

在定義了鍊錶結點對應的結構之後,接下來就是要根據輸入的結點資訊建立迴圈單向列表。

int code;

cout<

cin >> code;

int num_person;

cout << 「請輸入初始的人數:」;

cin >> num_person;

接下來輸入num_people個人的所持的密碼,而每個人的索引值即為輸入的次序。

pperson point_firstperson;

pperson point_lastperson;

pperson point_newperson;

for(int i=1; i<=num_person; ++i)

else

cout < point_lastperson->info_person.index;

point_lastperson->info_person.code = i;

}point_lastperson->person_next = point_firstperson;

point_lastperson= point_firstperson;

以上**的功能是根據輸入的個人資訊建立了迴圈單向列表,該列表的第乙個結點指標為point_currentperson。首先定義了三個結點的指標,其中point_firstperson表示第乙個結點的指標;point_lastperson表示在建立列表的過程中,最後乙個結點的指標;point_newperson表示新建立的結點指標。

通過for迴圈輸入num_person個人的密碼,需要注意的是,順時針圈中人的索引是從1開始的,所以for迴圈的迴圈變數i的初始值是1。如果是輸入的是第乙個結點的密碼,此時只需通過new分配新的記憶體,之後將當前最後乙個結點的指標指向第乙個結點即可;如果輸入的不是第乙個結點的密碼,此時為節點分配新的記憶體,然後將當前最後乙個結點的下乙個結點指標指向新分配的記憶體,之後將最後乙個結點的指標指向新分配的記憶體。最後,將輸入的密碼儲存在最後乙個結點的指標所指向的個人資訊中。

C 自定義鍊錶實現約瑟夫環(2 2)

從迴圈單向列表中刪除結點時,首先在鍊錶找到該結點,然後將該結點前乙個結點的person next指向該結點的person next即可,如圖所示。for int i 1 i num person i 其中,第乙個for迴圈的的作用是遍歷順時針圈中的所有人 第二個for迴圈的作用是根據密碼code從鍊...

鍊錶實現約瑟夫環

約瑟夫環 約瑟夫問題 是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依 此規律重複下去,直到圓桌周圍的人全部出列。實現 include using namespace ...

C 自定義鍊錶

c 中的鍊錶結構在程式中十分常見,用處很廣。鍊錶結構中,每個節點由值部分和指標部分組成,值部分即儲存的資料,指標指向下乙個節點,從而使得每個節點能夠連線起來,值和指標就像骨骼和關節一樣。自定義鍊錶,首先定義出節點的結構,用類表示為 public class node定義完節點,下面開始構造list鍊...