约瑟夫环问题(循环单链表)

#include<iostream>
using namespace std;
struct Xlist
{
    int data;
    Xlist *next;
};
void foundList(Xlist *&lista,int n)
{
    lista=new Xlist;
    lista->next=lista;
    Xlist *la;
    lista->data=1;
    la=lista;
    for(int i=2; i<=n; i++)
    {
        Xlist *s=new Xlist;
        s->data=i;
        s->next=la->next;
        la->next=s;
        la=s;
    }
}
void Answer(Xlist *lista,int total,int num,int sta)
{
    Xlist *la=lista;
    Xlist *s;
    sta--;
    while(sta!=0)
    {
        la=la->next;
        sta--;
    }
    if(num==1)
    {
        while(total>1)
        {
            s=la;
            la=la->next;
            cout<<s->data<<endl;
            delete s;
            total--;
        }
        cout<<"剩下的最后一个是:"<<la->data;
    }
    else
    {
        for(int i=num; i>2; i--)
        {
            la=la->next;
        }
        s=la->next;
        cout<<s->data<<endl;
        la->next=s->next;
        delete s;
        total--;
        while(total>1)
        {
            for(int i=num; i>1; i--)
            {
                la=la->next;
            }
            s=la->next;
            cout<<s->data<<endl;
            la->next=s->next;
            delete s;
            total--;
        }
        cout<<"剩下的最后一个是:"<<la->data;//这里一定要输出la->data,千万不要写lista->data,因为lista这个链表并没有删除节点,操作后lista和la表示的不是一个链表,lista还是完整的没删除过任何节点的链表,而la只剩下最后一个节点。这个bug找了好久我一开始写的lista->data,以为这两个是一样的。
    }
}
int main()
{
    Xlist *lista;
    int m,n,t;
    cin>>m>>n>>t;
    foundList(lista,m);
    Answer(lista,m,n,t);
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值