dhu 2.3 循环链表ADT模板简单应用算法设计:约瑟夫环

28 篇文章 5 订阅
这篇博客介绍了如何使用C++模板设计循环链表的抽象数据类型(ADT),并基于此实现约瑟夫环算法。约瑟夫环问题中,n个人围坐一圈,按顺时针方向报数,报到m的人出圈,其密码成为新的m值,直至所有人出圈。博客提供了具体的C++代码实现,展示了如何处理链表节点以及调整链表结构来解决这个问题。
摘要由CSDN通过智能技术生成

问题描述 :

目的:使用C++模板设计循环链表的抽象数据类型(ADT)。并在此基础上,使用循环链表ADT的基本操作,设计并实现单链表的简单算法设计。

内容:(1)请使用模板设计循环链表的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考网盘中的单链表ADT原型文件,自行设计循环链表的ADT。)

(2)ADT的简单应用:使用该ADT设计并实现循环链表应用场合的一些简单算法设计。

应用2:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。现在给定一个随机数m>0,从编号为1的人开始,按顺时针方向1开始顺序报数,报到m时停止。报m的人出圈,同时留下他的密码作为新的m值,从他在顺时针方向上的下一个人开始,重新从1开始报数,如此下去,直至所有的人全部出列为止。请在使用循环链表ADT的基础上,设计一个算法求出圈的顺序(以编号表示)。限定人数至少为1.

参考函数原型:

template

void Joseph(CirLinkList &A, int m);

//约瑟夫环专用结点类型

struct node{

int number;

int code;

};

输入说明 :

第一行:人数n

第二行:每个人所持的密码

第三行:给定的随机数m

输出说明 :

第一行:建立的循环链表的遍历结果(数据格式见测试数据范例)

空行

第三行:出圈的顺序(编号与编号之间以“->”分隔)

题解

之前貌似写过一个类似的题目来着。。
链表是带空头结点类型的

void solution(ListNode* head, int n)
{
    ListNode* p = head->next;
    ListNode* q1 = p, * q2 = q1;
    int len1 = 1;
    q1 = head;
    while (1)
    {
        if (len == 0)
            break;
        if (len1 == n)
        {
            len1 = 1;
            q2 = p;
            n = p->val;
            cout << p->num;
            if (len != 1)
                cout << "->";
            q1->next = p->next;
            p = q1->next;
            delete q2;
            q2 = p;
            len--;
        }
        else if (len1 != n)
        {
            len1++;
            q1 = q1->next;
            p = p->next;
        }
    }
    return;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值