设有n个人围成一个圆圈,现从第s个人开始报数,数到第m的人出列,然后从出列的下一个人重新开始报数,数到第m个人再出列,如此反复,直到所有的人全部出列为止。对于任意给定的n,s,m,求按出列次序得到的n个人员的序列。
首先,创建一个循环链表,这里默认头指针中的data为1,即为n个人中的第一个人
typedef int elemtype;
typedef struct node
{
elemtype data;
struct node *next;
}LinkList;
LinkList * Create()
{ LinkList * head;
LinkList *p,*tail;
elemtype x;
head=(LinkList *)malloc(sizeof(LinkList));
if(head==NULL)return head;
head->data=1;
head->next=head;
tail=head;
printf("请输入数据,从2开始,输入0为结束:\n");
scanf("%d",&x);
while(x!=0)
{
p=(LinkList *)malloc(sizeof(LinkList));
if(p==NULL)return head;
p->data=x;
tail->next=p;
tail=p;
scanf("%d",&x);
}
tail->next=head;
return head;}
出列算法:
第一:找到第s个报数的人:
LinkList * Find(LinkList *head,int s)
{
LinkList *p=head;
int count=1;
while(p)
{
if(count==s)
break;
else
{
p=p->next;
++count;
}
}
return p;}
第二:找到第m个人出列,并将报数起点设为m的下一个人:
int OutPut(LinkList *head,int m)
{
//循环做法
LinkList *p=head,*q;
if(p==NULL)return -1;
int i;
while(p->data!=p->next->data)
{
for(i=1;i<m-1;i++)
p=p->next;
q=p->next;//记录取出点
printf("\t%d",q->data);
p->next=q->next;
free(q);//删除取出点
p=p->next;//报数点
}
printf("\t%d",p->data);
return 0;}
主函数:
int main(){
LinkList * head=Create();
LinkList *p=Find(head,2);
OutPut(p,2);
printf(“\n”);
return 0;}