7-5 帶密碼的約瑟夫問題
帶密碼的約瑟夫問題:編號為1,2,......,n的n個人按照順時針方向圍坐一圈,每個人有自己的編號(正整數)、姓名和密碼(正整數)三個數據項。一開始任選一個正整數作為報數上限值,從第一個人開始順時針方向自1開始報數,報到m時停止報數。報m 的人出列,將他的密碼作為新的m值,從他在順時針方向的下一個人開始重新報數,如此下去,直到所有人全部出隊為止。設計一個程序來求出出隊順序。
輸入格式:
輸入人數 n(1≤n≤50),再逐行輸入每個人的信息(各項之間用逗號隔開),然后輸入報數上限值m。
輸出格式:
按出隊順序逐行輸出每個人的信息,每人信息一行,數據項之間用逗號隔開
輸入樣例:
在這里給出一組輸入。例如:
5
1,劉三,3
2,李麗,5
3,吳勇,8
4,錢多,2
5,齊民,4
2
輸出樣例:
在這里給出相應的輸出。例如:
2,李麗,5
3,吳勇,8
5,齊民,4
4,錢多,2
1,劉三,3結尾無空行
為了完成數據結構報告寫出來的東西
#include<iostream>
#include<iomanip>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
using namespace std;
typedef struct MyList
{
int num;
char name[10];
int code;
struct MyList *next;
}MyList,*List;
int main()
{
List L;
L=(List)malloc(sizeof(MyList));
L->next=NULL;
int n,ciallo1,ciallo3;
char ciallo2[10];
List a=L,b;
cin>>n;
for(int i=0;i<n;i++)
{
b=(List)malloc(sizeof(MyList));
scanf("%d,%[^,],%d", &ciallo1, ciallo2, &ciallo3);
b->num=ciallo1;
strcpy(b->name,ciallo2);
b->code=ciallo3;
b->next=NULL;
a->next=b;
a = b;
}
b->next=L;
int m=0;
cin>>m;
int count=0;
List c=L;
while(count<n)
{
for(int i=0;i<m;i++)
{
c=c->next;
while(c==L||c->num==0)
{
c=c->next;
}
}
cout<<c->num<<","<<c->name<<","<<c->code;
if(count!=n-1)
{
cout<<"\n";
}
c->num=0;
m=c->code;
count++;
}
return 0;
}