?? ldf19870326.txt
字號:
約瑟夫問題(Joseph)的一種描述方法是:編號為1,2,.......,n的n個人按順時針方向圍坐一個圈,每個人持人一個密碼(正整數)。一開始任選一個正整數作為報數上限值m,從第一個人開始按順時針方向自1開始順序報數,報到m的人出列。將他的密碼作為新的m值,從他在順時針方向上的下一個人開始重新從1報數,如此下去,直至所有人全部出列為止。試設計一個程序求出出列順序。
利用單向循環鏈表存儲結構模擬此過程,按照出列的順序印出各人的編號。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include<conio.h>
/*建立結構*/
struct ManNode
{
int Number;
struct ManNode * Next;
int Password;
};
void main()
{
int m;
int NumMan;
struct ManNode * Head;
void DeleteNode(int ManNumber,int number,struct ManNode * head);
struct ManNode * CreateList(int NumOfMan);
printf("請輸入參加的人數:\n");
scanf("%d",&NumMan);
Head=CreateList(NumMan);
printf("請輸入剛開始任選的人數m:\n");
scanf("%d",&m);
DeleteNode(NumMan,m,Head);
getch();
free(Head);
}
struct ManNode *CreateList (int NumOfMan)
{
struct ManNode * head,*ManNodePtr1,*ManNodePtr2;
int Num=1;
head=NULL;
ManNodePtr2=(struct ManNode *)malloc(sizeof(struct ManNode));
/*分配存儲單元*/
printf("請輸入用戶所持有的密碼:");
scanf("%d",&ManNodePtr2->Password);
ManNodePtr2->Number=Num;
head=ManNodePtr2;
while(Num!=NumOfMan)
{
Num++;
ManNodePtr1=(struct ManNode *)malloc(sizeof(struct ManNode));
printf("請輸入用戶所持有的密碼:");
scanf("%d",&ManNodePtr1->Password);
ManNodePtr1->Number =Num;
ManNodePtr2->Next =ManNodePtr1;
ManNodePtr2=ManNodePtr1;
}
ManNodePtr2->Next =head;
printf("輸入結束!\n");
return head;
}
void DeleteNode (int ManNumber,int number,struct ManNode * head)
{
int num=1;
struct ManNode *ManNodePtr1;
struct ManNode *ManNodePtr2;
ManNodePtr1=ManNodePtr2=head;
while(ManNumber>0)
{
while(num!=number)
{
ManNodePtr2=ManNodePtr1;
ManNodePtr1=ManNodePtr1->Next ;
number--;
}
number=ManNodePtr1->Password;
printf("出列人的編號:%d\n",ManNodePtr1->Number) ;
ManNodePtr2->Next =ManNodePtr1->Next ;
ManNodePtr1=ManNodePtr1->Next ;
ManNumber--;
}
printf("\n運行結束!!!\n");
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -