有M个人围一圈玩报数,凡报到N的出退出,输出每次退出的人的编号。
#include
"stdio.h"
struct
game
{
int
ID
game
*pNext
}
void
main()
{
int
i,m=17,n=3
game
*pPrev,*pNode,*pTop
printf("Input
M
N:")
scanf("%d
%d",&m,&n)
if(n>m||n<1)
return
pTop=new
game
pTop->ID=1
pPrev=pTop
for(i=2i<=mi++)
{
pNode=new
game
pNode->ID=i
pPrev->pNext=pNode
pPrev=pNode
}
pNode->pNext=pTop
pPrev=pNode
pNode=pTop
i=0
while(pNode->pNext!=pNode)
{
i++
if(i%n==0)
{
printf("%d
",pNode->ID)
pPrev->pNext=pNode->pNext
delete
pNode
pNode=pPrev->pNext
i=0
}
else
{
pPrev=pNode
pNode=pNode->pNext
}
}
delete
pNode
}
注释我用的/**/,你之前逻辑不是很清晰,顺序我也做了一些修改#include <iostream>
using namespace std
int main ()
{ struct Person
{
int No
int SortNo
Person* PNext//指向自身结构体的指针,链表所必需
}
//围成一圈
Person * pHead, * tmpP//pHead链表头,tmpP动态临时指针
for(int i=0i<69i++)
{
Person* pStu=new Person//新申请内存用于存放一个学生信息
if(i==0) pHead=pStu//记录链表头
else {//拉手
tmpP->PNext=pStu
}
int No=100+i+1 if(i>34) No=200+i-34//学号
pStu->No=No pStu->SortNo=i+1//成员赋值
// pHead->PNext=pStu//成员赋值
tmpP=pStu
if(i==68) pStu->PNext=pHead//最后一名学生拉着第一个学生
}
//报数游戏
/*因为判断的时候第一个已经是head->next了,所以这从1开始计数,1表示head*/
int count=1//报数
int Num=0//退出的人数,当Num==68时,结束游戏
Person * pCurrent=pHead//当前报数学生
Person * PPre=pHead//当前报数学生的前一个学生
while(1)
{
/*
count++
if(count%3==0)//退出游戏
{
//PCurrent//退出游戏
PPre=pCurrent->PNext//拉着下一个PCurrent->PNext同学的手
Num++
}
if(Num==68) break
PPre=pCurrent//
pCurrent=pCurrent->PNext//轮到下一个学生
if(count%3==0) delete pCurrent//释放内存
*/
PPre=pCurrent
if(Num==68) break
pCurrent=pCurrent->PNext//轮到下一个学生
count++ /*先赋值之后进行count++判断,因为count++之后马上是判断,所以先指向下一个学生再判断*/
if(count%3==0)//退出游戏
{
//PCurrent//退出游戏
PPre->PNext=pCurrent->PNext/*构建新的循环链表*/
delete pCurrent//释放内存
pCurrent=PPre//拉着下一个PCurrent->PNext同学的手 /*重新赋值*/
Num++
}
}
cout<<"StudentNo="<<pCurrent->No<<endl
cout<<"SortNo="<<pCurrent->SortNo<<endl
return 1
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)