【数据结构实验】约瑟夫环的实现

来源:互联网 发布:传奇武器数据库 编辑:程序博客网 时间:2024/06/06 02:50

#include <iostream>#include <iomanip>using namespace std;typedef int ElemType;typedef struct LNode{ ElemType num; ElemType sec; struct LNode *next;}LNode, * LinkList;void CreatList(LinkList &L,int n){ LNode *r,*s; L = new LNode; L->next = NULL; r = L; cout<<endl<<"请输入"<<n<<"个人的密码"<<endl<<endl; for (int i = 0; i <n; i++) {  s = new LNode;//申请新的结点  s->num=i+1;  cout<<"请输入第"<<i+1<<"个人的密码:";  cin>>s->sec;//依次输入每个人的密码  s->next = L->next;  r->next = s;  r = s; }}void Leave(LinkList &L,int m){ LNode *p,*q,*s; p=L->next; cout<<"密码为"<<m<<",出列编号为:"; while(p->next!=p)//如果还有不止一个结点就继续报数,如果只有一个结点就直接输出其对应的num {  for(int i=1;i<m;i++)//每次循环找到报数上限第sec个结点,读取对应的num并输出,删除这个结点  {   q=p;   p=p->next;  }  cout<<p->num<<endl;  m=p->sec;  cout<<"密码为"<<m<<",出列编号为:";  s=p;  q->next=p->next;  p=p->next;  free(s);//释放结点 } cout<<p->num<<endl; free(p);//释放最后一个结点}void PrintList(LinkList L){ LNode *t; t = L->next; while (1) {  cout<<setiosflags(ios::fixed)<<setiosflags(ios::right);  cout <<setw(10)<< t->num << "    "<<t->sec<<endl;;  t = t->next;  if (t->next == L->next)  {   cout<<setw(10) << t->num<< "    "<<t->sec<<endl;;   break;  } }}void main(){ LinkList L; int m,n;//m为初始密码,n为报数人数 cout<<"请输入初始密码(正整数)和人数:"<<endl; cin >>m>>n; CreatList(L,n); cout << "每个人的编号 密码为:" << endl; PrintList(L);//输出每个人的编号和密码核对是否有错 Leave(L,m);//报数函数}

11 0
原创粉丝点击