資料結構課作業,上網找了一圈發現沒有和我們題一樣的。自己寫乙個分享給有需要的同學。
題目如下:
題目要求迴圈單鏈表完成,先放一下結構體,很簡單的乙個單鏈表的儲存結構。
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 開始時每個人...