数据结构-joseph环

joseph环
//时间:05/07/04
//程序:张建波

//输入 n=7   // 3,1,7,2,4,7,4  //输出6 7 4 1 5 3 2


#include <iostream.h>
#include "key.h"

typedef struct person
{ int pwd;  //密码
  int num;  //人数
  struct person *next;  //指向结构体的指针
}PERSON;
 
 

void OutPut(int *a,int n);//输出结果
int CreatPersonList(PERSON *head);// 创建一张链表
int Fx_PersonList(PERSON *head,int n,int *a);//模拟报数


int _f4_main() //函数入口
 {

   PERSON *head;  //定义链表头

   cout<<"joseph环 问题模拟!"<<endl;

   head=new person; //新建PERSON,并分配内存

   int n=CreatPersonList(head);  // 创建一张链表,同时返回人数 n

   int *a=new int[20]; //保存输出的结果

   int x=Fx_PersonList(head,n,a);  //模拟报数,同时返回出队人数 count
  
   OutPut(a,x);  //输出序列

   InitKey();//键盘中断

   return 0;
  }


int CreatPersonList(PERSON *head){
  int n,m,i;
  PERSON *p,*q;
  cout<<"/n请输入 n=";
  cin>>n;
  p=head;        //p指向表头
   for(i=1;i<=n;i++){  //建立链表
      cout<<"/n请输入第"<<i<<"的人的报数密码m=";
      cin>>m;
      p->pwd=m;
      p->num=i;
      q=new person;
    if(i==n)p->next=head; //当 i==n时,循环结束把p1指向表头
    else
        {
        p->next=q;
        p=q;
        }

   }
   return n;

}


int Fx_PersonList(PERSON *head,int n,int *a){
   PERSON *p1,*p0,*p;
   int tm;  //临时变量,保存上一密码值
   int m;  //报数密码 m
   int count=1; //出队计数

    p0=p1=head;  //使p0,p1都指向head头

   cout<<"/n请输入 M 的 起始值 m=";
   cin>>m;
   while(count<=n-1)
     {
          for(int i=1;i<m;i++)
            { //把 m 重新作为报数上限值
            p1=p0;
            p0=p0->next;
             tm=p0->pwd;
            }
        m=tm;
        p=p0->next;
        a[count++]=p0->num;   //把每次出队的序号保存在a[x]中
        p1->next=p0->next;
        delete p0;
        p0=p;
     }
    a[count]=p0->num;   //把每次出队的序号保存在a[x]中
    p1->next=p0->next;
    delete p0;

    return count;
}

void OutPut(int *a,int n)
{
  cout<<"正确的输出序列为:";
     for(int i=1;i<=n;i++)     cout<<a[i]<<" ";
  
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值