⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3.cpp

📁 都是以前随手编写的笑程序:总的来说只有五个<回文游戏,层次遍历二叉树,猴子选大王,先序、中序、后序遍历的递归算法等等> 如果对你又帮助你就下来看看吧
💻 CPP
字号:
//3.约瑟夫环
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
  typedef struct QN
  { int data, num; QN *next; }QN,*Qpt;

   typedef struct
   {Qpt front;  //队头指针
	Qpt rear;   //队尾指针
   }LinkQ;

   int InitQueue(LinkQ &Q)//初始化队列
   {Q.front=Q.rear=(Qpt)malloc(sizeof(QN));
	if(!Q.front)return 0;
	Q.front->next=NULL;
	return 1;
   }

    void DestroyQueue(LinkQ &Q)//销毁队列
	{while(Q.front)
	   {Q.rear=Q.front->next;
		free(Q.front);
		Q.front=Q.rear;
	    }
	}

    int EnQueue(LinkQ &Q,int e,int num)//向队列中(确切的说是在对尾插入)插入元素e和密码num;
	{ QN *p1=NULL;
	  p1=(Qpt)malloc(sizeof(QN));
	  if(!p1)return 0;
	  p1->data=e;p1->num=num;p1->next=NULL;
	  Q.rear->next=p1;   Q.rear=p1;
	  Q.rear->next=Q.front->next;
	 return 1;
	}
	
  void main()
	{ int n=0,m=0,k=1,s=0;//n表示环内总人数,m时开始计数的初值.
                          //k环内人的号数,s是向环内插入的'人'
	  LinkQ Lq; QN *p1,*p;//*p1表示环内人,*p存放要出列的人的指针;
	  p1=NULL;  p=NULL;
	  if(InitQueue(Lq)==0) cout<<"队列初始化失败"<<endl;
	  cout<<"环内总人数n=";cin>>n;
	  cout<<"初始计数m=";  cin>>m;
	  cout<<"请依次输入每个人的密码"<<endl;
	for(int i=0;i<n;i++)
	{ cin>>s; int j=i+1;
	  if(!EnQueue(Lq,s,j))
		{cout<<"密码输入失败,重新输入!"<<endl;i--;}
	}
	p=p1=Lq.front->next;
	cout<<"环内现有"<<n<<"个人\n";
	cout<<"他们的出列(from1~~~~"<<n<<")的顺序如下"<<endl;
	              //依次输出环内人的出列顺序
	while(k<=n)
	{	
		for(int i=1;i<m;i++){p=p1;p1=p1->next;}//保存*p1到*p,并取它的
		                                  //下一位重新开始报数开始报数;
		m=p1->data;                    //取*p1的密码为新一轮报数的初值
		cout<<"第"<<k<<"个人的"<<"出列号为"<<"\t"<<p1->num<<endl;
		k++; p->next=p1->next; free(p1); p1=p->next;
	}
  }
/*运行结果如下:
环内总人数n=8
初始计数m=9
请依次输入每个人持有的密码
44
11
52
45
6
58
41
48
环内n个人出列(from1~~~~n)的顺序是
第1个人 出列号为1
第2个人 出列号为3
第3个人 出列号为7
第4个人 出列号为8
第5个人 出列号为6
第6个人 出列号为2
第7个人 出列号为4
第8个人 出列号为5*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -