双向链表-实现循环报数

#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