#include<iostream>
using namespace std;
class dnode
{
public:
int nodeValue;
dnode *prev;
dnode *next;
dnode(){next = this;prev = this; }
dnode(const int& value): nodeValue(value){
next = this;
prev = this;}
};
class List:public dnode{
private: dnode *first;
unsigned listsize;
public:
List():first(),listsize(0){first=new dnode(0);first->next=first;first->prev=first;};//构造函数,使first储存0
~List(){
dnode *p=first->next,*p1;
while(p!=first){
p1=p;
p=p1->next;
delete p1;}} ;
void push_front(const int&d);
void push_back(const int&d);
void insert(int pos,const int &d); //从first开始,在第k个位置插入d
void shanchu(const dnode *p); //删除节点为p的节点
void chuquan(int pos); //出圈报的数字
bool empty(); //判断链表是否为空
void pop_front();
void pop_back();
void erase(int pos);}; //删除第pos节点
void List::push_back(const int&d){
dnode *p=new dnode(d),*p1=first->prev;
p1->next=p;p->prev=p1;
p->next=first;first->prev=p;
listsize++;}
void List::push_front(const int&d){
dnode *p=new dnode(d),*p1=first->next;
p1->prev=p;p->next=p1;
p->prev=first;first->next=p;
listsize++;}
void List::insert(int n,const int &d){
dnode *p=new dnode(d),*p1=first,*p2;
int i;
for(i=0;i<n;i++){
p1=p1->next;}
p2=p1->next;
p1->next=p;p->prev=p1;
p2->prev=p;p->next=p1;
listsize++;}
void List::shanchu(const dnode *p){ //删除节点p(指和p储存的数据一样的节点,因为这个问题中不会存在储存数据相同的节点)
dnode *p1=first,*p2,*p3;
int i=0;
while(i<=listsize){
p1=p1->next;
if(p1->nodeValue==p->nodeValue) break;
i++;}
p2=p1->prev;p3=p1->next;
p2->next=p3;
p3->prev=p2;
listsize--;
delete p1;
}
void List::chuquan(int x){
int i;
dnode *p=first,*p1; // 从哑元节点开始
while(!empty()){
for(i=0;i<x;i++) //每报到x就出圈
{ p=p->next;
if(p==first) p=p->next; //因为哑元节点不参与报数,每当当前位置指向哑元节点就使当前位置往后挪一位
}
p1=p->next; //后续操作会删除p的储存信息,先使p1指向p后面的位置,暂时保存信息
cout<<"序号为 "<<p->nodeValue<<" 的人出圈"<<endl;
shanchu(p);
cout<<"--------------------------------------------------"<<endl;
p=p1->prev; //退回到出圈前的一个位置,开始报数
}}
bool List::empty(){
return listsize==0;
}
void List::pop_front(){
dnode *p=first->next ;
first->next=p->next ;
p->next->prev=first;
listsize--;
delete p;
}
void List::pop_back(){
dnode *p=first->prev;
p->prev->next =first;
first->prev =p->prev ;
listsize--;
delete p;
}
void List::erase(int pos){
int i=0;
dnode *p=first;
while(i!=pos){
p=p->next ;
i++;
}
p->prev->next =p->next ;
p->next->prev =p->prev ;
listsize--;
delete p;
}
int main(){
List l;
int i,a[1000],m,n;
cin>>m>>n; //m表示报数的总人数,n表示报的数字
for(i=0;i<m;i++)
{a[i]=i+1;
}
for(i=0;i<m;i++)
l.push_back(a[i]);
l.chuquan(n);
}
双向链表-实现循环报数
猜你喜欢
转载自blog.csdn.net/cangzhexingxing/article/details/124725282
今日推荐
周排行