?? joseph.txt
字號:
題目:約瑟夫(Joseph)問題的一種描述是:編號為1,2,……,n的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。一開始任選一個整數作為報數上限值m,從第一個人開始按順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下一個開始重新從1報數,如此下去,直至年有人全部出列為止。試設計一個程序求出出列順序。
源代碼:
#define ERROR 0
#define ElemType peo
typedef peo{
int order;//人的編號
int password;//人的密碼
peo *next;
}
ElemType *CreatClist(int n) {//創建一個大小為n的空循環鏈表,返回鏈表頭指針
int i;
ElemType *p,*q,*head;
for(i=1;i<=n;i++){
q=p;
p=(ElemType *)malloc(sizeof(ElemType));//開辟空間
if(i==1)head=p;
else q->next=p;
}
p->next=head;//實現循環鏈
return (head);//返回循環鏈表的頭指針
}
ElemType* ClistDel(ElemType *p,int m){//刪除從當前結點開始往后數第m個元素
ElemType *q ;
int i;
for(i=1;i<m;i++){//查找要刪除的結點,并使p指向要刪除的結點,q指向要刪除的結點的前面一個結點
q=p;
p=p->next;
}
q->next=p->next;//刪除該結點
return(p);返回該結點的地址
}
void main(){
int m,i,n;
ElemType *head,*p;
p=NULL;
printf("Please input the total num of the people:");//輸入一共有多少人參加報數
scanf("%d",&n);
if(n<=0){//判斷輸入的人數是否有錯
printf("參加人數 error!!!");
exit(ERROR);
}
printf("please input m:\n");//輸入一開始報數的上限m
scanf("%d",&m);
if(m<=0){
printf("初始報數上限error!!!");
exit(ERROR);
}
head=CreatClist(n);
p=head;
for(i=1;i<=n;i++){
p->order=i;
printf("please enter the %dst password:",i);
scanf("%d",&p->password);//賦密碼
if(p->password<=0){//判斷密碼是否輸入錯誤
printf("密碼 error!!!");
exit(ERROR);
}
p=p->next;
}
printf("The output order is:");
p=head;
while(p->next!=p){
p=ClistDel(p,m);
m=p->password;//修改m,為下一次出列做準備
printf("%d ",p->order);//輸出出列人的編號
p=p->next;//結點p后移
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -