這篇文章主要為大家展示了“如何實現C語言版約瑟夫問題算法”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“如何實現C語言版約瑟夫問題算法”這篇文章吧。
有n個人圍坐一圈,現從第s個人開始報數,數到m的人出列,接著從出列的下一個人開始重新報數,數到m的人又出列.如此下去,直到所有人都出列為止.試設計確定他們出列次序序列的程序
1、確定存儲結構:n個人圍成一圈,故使用循環單鏈表來存儲序號
2、算法實現:
該問題共n、m、s三個未知量,所以可以通過三個循環來實現,第一個循環用來確定最開始第一個報數的人的指針位置(單鏈表的頭節點指針指向第s個人),第二個循環用來控制輸出序號的次數(共n次),第三個循環用來數數(每一次循環使指針移動m次)
# include <stdio.h>
# include <malloc.h>
typedef struct Node
{
int number;
struct Node * pNext;
}NODE, *PNODE;
PNODE creat_list(int n);
int main (void)
{
int n,m,s;
printf("約瑟夫環問題:\n");
printf("設有n(編號為“0 1 2 3 .....n-1 n”)個人圍坐一圈,現從第s個人開始報數,數到m的人出列,\n求最后的出列順序。\n");
printf("請設置n, s, m :\n");
printf("n = ");
scanf("%d", &n);
printf("s = ");
scanf("%d", &s);
printf("m = ");
scanf("%d", &m); //問題引導提示代碼段
PNODE pHead = NULL;
pHead = creat_list(n);
pHead->number = 1; //創建單鏈表
PNODE p = pHead; //定義頭指針
int i,j,k; //定義循環參數
for(j = 1; j < s; j++)
{
p = p->pNext;
} //第一個循環確定第一個報數的人在循環單鏈表中的位置
for(i = 1; i <= n; i++) //外部循環代表遍歷到最后一個所需要的循環次數
{
for(k = 1; k < m; ) //內部循環代表遍歷出列的人
{
if(p -> pNext -> number != 0)
{
p = p -> pNext;
k++;
}
else
{
p = p -> pNext;
}
}
printf("%d ",p -> number);
p -> number = 0;
do
{
p = p -> pNext;
}while(p -> number == 0);
}
printf("\n");
return 0;
}
PNODE creat_list(int n) //單鏈表的創建
{
PNODE pHead = (PNODE)malloc(sizeof(NODE));
PNODE pTail = pHead;
int i;
for(i = 2; i <= n; i++)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
pNew->number = i;
pTail->pNext = pNew;
pNew->pNext = pHead;
pTail = pNew;
}
return pHead;
}以上是“如何實現C語言版約瑟夫問題算法”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。