資料結構作業1 約瑟夫環問題

2021-10-05 19:08:36 字數 1489 閱讀 5586

資料結構課作業,上網找了一圈發現沒有和我們題一樣的。自己寫乙個分享給有需要的同學。

題目如下:

題目要求迴圈單鏈表完成,先放一下結構體,很簡單的乙個單鏈表的儲存結構。

typedef struct lnode   //定義單鏈表節點型別 

linklist;

單鏈表的迴圈體現在建表上,這裡採用尾插法(右插法)建表,以保證鍊錶是正序的。煉表頭結點也存放資料。

建表函式沒有返回值,所以需要先定義乙個單鏈表指標變數,在函式中引用。函式傳三個引數,第乙個引數是引用的迴圈單鏈表,第二個引數是儲存單鏈表資料域的陣列,第三個引數是單鏈表的長度。

void createlistr(linklist *&l, int a, int n)

r->next = l->next; //構造迴圈結構

l = l->next;

}

因為約瑟夫環需要不斷地讓成員「出列」,所以還需要定義乙個刪除節點的函式。和單鏈表刪除節點的函式基本一致,返回值是刪除的節點的資料。傳兩個引數,乙個引數是引用的迴圈單鏈表,乙個是要刪除節點的位置(從頭結點開始第幾個節點)。

int listdelete(linklist *&l, int i)

q = p->next;

e = q->data;

p->next = q->next;

free(q);

return e;

}

下面就是main函式了,也是約瑟夫環的主要功能實現之處。

由於第一次出列是使用者輸入的資料,所以第一次出列單獨寫一段**。

之後的節點出列巢狀兩個for迴圈,外層迴圈計數還剩幾個節點沒有出列,內層迴圈計數哪個節點需要出列。這裡需要注意乙個問題,節點出列之前要標定新的頭指標的位置,出列之後再移動頭指標。

int main()

; int b[20] = ;

for (int i = 0; i < n; i++)

createlistr(l, a, n);

//操作第乙個節點

linklist *p = l;

int e;

for (int i = 0; i < m; i++) //標明新頭指標位置

e = listdelete(l, m-1);

b[0] = e;

l = p; //移動頭指標

//操作其他節點

for (int i = 0; i < n - 1; i++)

e = listdelete(l, e-1);

b[i + 1] = e;

l = q; //移動頭指標

} //按順序輸出

for (int i = 0; i < n; i++)

system("pause");

return 0;

}

以上就是全部**,第一次寫部落格,如有不正確之處還望海涵。

資料結構 約瑟夫環問題

實驗一線性表的應用 實驗目的和要求 通過實驗進一步理解線性表的邏輯結構和儲存結構,提高使用理論知識指導解決實際問題的能力,熟練掌握鍊錶的實際應用。主要內容 題目1 josephus環問題 問題描述 約瑟夫 joseph 問題的一種描述是 編號為1,2,n的n個人按順時針方向圍坐一圈,每人持有乙個密碼...

資料結構 約瑟夫環問題

1.問題描述 約瑟夫環 約瑟夫問題 是乙個數學的應用問題 已知n個人 以編號1,2,3 n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。鍊錶思路 我是通過單鏈表實現的,首先要思考...

資料結構 約瑟夫環問題

約瑟夫問題是個有名的問題 n個人圍成一圈,從第乙個開始報數,第m個將被殺掉,最後剩下乙個,其餘人都將被殺掉。例如n 6,m 5,被殺掉的順序是 5,4,6,2,3。分析 1 由於對於每個人只有死和活兩種狀態,因此可以用布林型陣列標記每個人的狀態,可用true表示死,false表示活。2 開始時每個人...