约瑟夫问题——循环链表实现

本文介绍了一个基于C++实现的约瑟夫环问题解决方案。通过定义结构体和类来组织人员及其出局顺序,该程序能够创建一个环形链表,并按照指定规则逐个移除节点,直至找到最后剩余的人。此实现不仅展示了链表的基本操作,还涉及了内存管理和算法应用。
摘要由CSDN通过智能技术生成

josehus.h



#pragma once
struct person
{
    int num;                              
    person *next;
};

class josering                          
{
public:
    josering(int x , int y );
    ~josering();
    void getnum();                      
private:
    person *head;                     
    int n ;
    int m ;
};


josehus.cpp



#include "josehus.h"
#include<iostream>
using namespace std;

josering::josering(int x,int y)         

{
   n=x;
   m=y;
   person *p,*end;  
   for(int i=1;i<=n;i++)
   {
        p=new person;
        p->num=i;
        if(i==1)                           
        {
            head=p;
            end=p;
        }  
        else                            
        {
            end->next=p;
            end=p;    
        }
   }
   end->next=head;                    
}
josering::~josering()
{
    person* p=head,*q;
    while(p->next!=head)//p指向最后一个结点时结束循环
    {
        q=p;
        p=p->next;
        delete q;
    }
    delete p;//删除头结点

}

void josering::getnum()
{
     person *p1,*p2,*p;
     p1=head;
     for(int i=1;i<=n-1;i++)          
     {
         int count=1;                                           
         while(count++<m)             
         {
            p2=p1;
            p1=p1->next;
         }
            p=p1;                    
            cout<<"第"<<i<<"轮:"<<p->num<<"出列"<<endl;
            cout<<"----------------------------------------"<<endl;
            p2->next=p1->next;        
            p1=p1->next;             
            delete p;                
     }
     cout<<"最后出列的人的编号为:"<<p1->num<<endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值