joseph c语言,C语言指针-C语言约瑟夫(Joseph)问题
六一兒童節到了,學校給桐桐班級(總共 30 人)分配了 15 個草莓蛋糕和 15 個冰激凌。為了公平起見,老師將 30 位同學圍成一個圈,從第一個人開始依次報數,數到 9 的人出列并給他一個冰激凌;他的下一個人再從 1 開始報數,同樣數到 9 的人出列并給他一個冰激凌;依此規律重復下去,直到還剩 15 個人為止。剩下的 15 個人每人給一個草莓蛋糕。
該問題中說“將 30 位同學圍成一個圈”,因而可以構造一個單鏈環來表示。
30 位同學分別用編號 1~30 表示。聲明一個結構體類型來構造單鏈環,鏈表中的每個結點都有兩個成員,其中數值域存放同學的編號,指針域則指向其下一位同學。數值域存放 30 的結點的指針域指向頭指針(即數值域存放 1 的結點),這樣就構成了一個完整的單鏈環。
struct node{
int num; //存放同學編號
struct node *next; //指向下一位同學
} *head;
設置兩個計數器 i 和 left,left 表示鏈表中的結點數。從 head 結點開始遍歷鏈表,每遍歷一個結點i的值增加 1,到第 9 個結點時輸出該結點數值域中的編號,并將其從鏈表中刪除,left 減小 1;之后,計數器 i 歸 0,繼續從下一個結點開始遍歷鏈表……直到 left 的值為 15(即還剩余 15 個結點)為止。
已經輸出的 15 個編號的同學就是得到冰激凌的同學。最后再輸出剩余鏈表中的 15 個編號,這 15 個編號的同學就是得到草莓蛋糕的同學。
代碼清單 1:約瑟夫問題
#include
#include
#include
struct node{
int num;
struct node *next;
};
struct node *head,*p,*q;
int main( )
{
int i,j,left;
head = malloc(sizeof(struct node));
head -> num = 1; //建立初始的鏈環
head -> next = head;
q = head;
for(i=2;i<=30;i++) //以 i 作為數值域建立結點,并接入鏈環
{
p = malloc(sizeof(struct node));
p -> num = i;
q -> next = p;
p -> next = head;
q = p;
}
q = head; //出列操作
left = 30;
do { //重復報數出列
i = 1; // i 作為報數器
while (i < 9){ //循環報數,報 m 的出列
p = q;
i = i+1;
q = q->next;
}
printf("%2d ",q->num); //輸出出列人的編號
left = left-1; //圈內剩余人數
p->next = q->next;
free(q); //釋放該結點
q = p -> next;
} while (left > 15); //直到圈里還剩15人,結束操作
printf("\n");
for(i=1;i<=15;i++){
printf("%2d ",q->num);
q = q -> next;
}
system("pause");
return 0;
}
運行結果為:
9 18 27? 6 16 26? 7 19 30 12 24? 8 22? 5 23
25 28 29? 1? 2? 3? 4 10 11 13 14 15 17 20 21
總結
以上是生活随笔為你收集整理的joseph c语言,C语言指针-C语言约瑟夫(Joseph)问题的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 学c语言用vs,毫无编程基础的小白准备学
- 下一篇: 文件管理器android实现,Andro
