约瑟夫问题_笔记

这里写图片描述

此时m=8,n=3,每次数3次就将那个数进行输出,输出后的数将会被释放

  1. 123输出3
  2. 456输出6
  3. 781输出1
  4. 245输出5
  5. 782输出2
  6. 478输出8
  7. 474输出4
  8. 777输出7

需要添加循环链表类,笔记里有!
main.cpp

#include"List.h"

#define M 8
#define N 3

typedef struct MYNUM
{
    CircleLinkNode* node;
    int val;
}MyNum;

void Myprint(CircleLinkNode* data)
{
    MyNum * num = (MyNum*)data;

    cout << num->val << " " ;

}
bool MyCompare(CircleLinkNode* data1, CircleLinkNode* data2)
{
    MyNum* num1 = (MyNum*)data1;
    MyNum* num2 = (MyNum*)data2;

    if (num1->val == num2->val)
    {
        return true;
    }

    return false;
}


int main()
{
    List* l = new List();

    MyNum num[M];
    for (size_t i = 0; i < 8; i++)
    {
        num[i].val = i + 1;
        l->Insert_CircleLinkList(l->linklist,i,(CircleLinkNode*)&num[i]);
    }

    //打印
    l->Print_CircleLinkList(l->linklist,Myprint);
    cout << endl;




    int index = 1;
    //辅助指针
    CircleLinkNode* pCurrent = l->linklist->head.next;
    while (l->Size_CircleLinkList(l->linklist) > 1)
    {
        if (index == N)
        {
            MyNum* temNum = (MyNum*)pCurrent;
            cout << temNum->val << " ";

            //保存待删除节点的下一个节点
            CircleLinkNode* pNext = pCurrent->next;

            //根据值删除
            l->RemoveByValue_CircleLinkList(l->linklist,pCurrent,MyCompare);
            pCurrent = pNext;
            if (pCurrent == &(l->linklist->head))
            {
                pCurrent = pCurrent->next;
            }

            index = 1;
        }

        pCurrent = pCurrent->next;
        if (pCurrent == &(l->linklist->head))
        {
            pCurrent = pCurrent->next;
        }

        index++;
    }

    if (l->Size_CircleLinkList(l->linklist) ==1)
    {
        MyNum* tempNum = (MyNum*)l->Front_CircleLinkList(l->linklist);
        cout << tempNum->val;
    }
    else
    {
        cout << "出错!" << endl;
    }



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值