#include<cstdio>
int n,m;
struct LinkList
{
int bianhao;
int mima;
struct LinkList* next;
}LinkHuan[50];
void duru()
{
printf("请按编号顺序输入密码值:\n");
for(int i=1;i<=n;i++){
scanf("%d",&LinkHuan[i].mima);
LinkHuan[i].bianhao=i;
if(i==n) LinkHuan[i].next=&LinkHuan[1];
else LinkHuan[i].next=&LinkHuan[i+1];
}
}
void shuchu()
{
printf("正确的出列顺序为:\n");
LinkList* p=&LinkHuan[1];
while(p->next!=p){
for(int i=1;i<m-1;i++)
p=p->next;
printf("%d出列\n",p->next->bianhao);
m=p->next->mima;
p->next=p->next->next;
if(m!=1)
p=p->next;
}
printf("%d出列\n",p->bianhao);
}
int main()
{
printf("请输入人的个数n和m的初始值:\n");
scanf("%d%d",&n,&m);
duru();
shuchu();
return 0;
}
/*
7 20
3 1 7 2 4 8 4
*/
这种是先循环m-2次,在看m的值循环第m-1次。
一定要注意m为1的情况。
#include<iostream>
#include<malloc.h>
using namespace std;
struct LinkList
{
int data; //代表编号结点的数据
int password;//代表密码结点的数据
LinkList *next;//代表后一个结点的地址
};
int m,n,i,j;
LinkList *p,*q,*first;
void Printf()
{
cout<<"请输入m的初始值 m:";
cin>>m;
cout<<"请输入人数 n:";
cin>>n;
}
int ShuruMima()
{
for(i=1;i<=n;i++)
{
if(i==1)
{
first=p=(LinkList*)malloc(sizeof(LinkList));
if(p==0)
return 0;
}
else
{
q=(LinkList*)malloc(sizeof(LinkList));
if(q==0)
return 0;
p->next=q;
p=q;
}
cout<<"请输入第 "<<i<<" 个人的密码: ";
cin>>(p->password);
p->data=i;
}
}
void ShuChu()
{
p->next=first; //让表尾指向表头形成循环链表
p=first;
cout<<"出列顺序为: ";
for (j=1;j<=n;j++)
{
for(i=1;i<m;i++,p=p->next);
m=p->password;
cout<<p->data<<" ";
p->data=p->next->data;
p->password=p->next->password;
q=p->next;
p->next=p->next->next;
free(q);
}
cout<<endl;
}
int main()
{
Printf();
ShuruMima();
ShuChu();
return 0;
}
这个是循环m-1次后,直接把下个节点移上来,相对简单。
写个报个弄了半天,感觉浪费了不少时间,还弄的费劲。