#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次后,直接把下个节点移上来,相对简单。
写个报个弄了半天,感觉浪费了不少时间,还弄的费劲。
时间: 2024-11-01 16:59:58