目录

1.题目

2.题解

3.代码实现


1.题目

圆桌问题

作者: 冯向阳 时间限制: 1S 章节: DS:数组和链表

问题描述 :

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

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

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

圆桌上围坐着2n个人。其中n个人是好人,另外n个人是坏人。如果从第一个人开始数数,数到第m个人,则立即处死该人;然后从被处死的人之后开始数数,再将数到的第m个人处死……依此方法不断处死围坐在圆桌上的人。试问预先应如何安排这些好人与坏人的座位,能使得在处死n个人之后,圆桌上围坐的剩余的n个人全是好人。

输入说明 :

输入:好人和坏人的人数n(<=32767)、步长m(<=50);

输出说明 :

输出2n个大写字母,‘G’表示好人,‘B’表示坏人,50个字母为一行。

输入范例 :

52 6

输出范例 :

BGGBGBGGBBBBGGGGBBBGBGGBGBBGGBBGBGBBGGGBBBGBGGBBGG
BBGBBGGGGBBBBGGBGGBBGBBGGBGBBGGBBBGGBGGBBGGGBBGBGG
GBGB


2.题解

  • 挖坑

3.代码实现

  • 1

    #include <iostream>
    #include <vector>
    #include <cstring>
    #include <sstream>using namespace std;/* 循环单链表的结点定义*/
    template<class ElemType>
    struct LinkNode
    {ElemType data;int num;int used;//0表示没用过;LinkNode<ElemType> *next;LinkNode(LinkNode<ElemType> *ptr = NULL){next = ptr;num=0;used=0;} //构造函数1,用于构造头结点LinkNode(const ElemType &item, int x=0,LinkNode<ElemType> *ptr = NULL) //构造函数2,用于构造其他结点//函数参数表中的形参允许有默认值,但是带默认值的参数需要放后面{next = ptr;data = item;num=x;used=0;}//int getNum(){ return number; } //取得结点的序号ElemType getData(){ return data; }   //取得结点的数据域的值void SetLink( LinkNode<ElemType> *link ){ next = link; }  //修改结点的next域void SetLink( ElemType value ){ data = value; }   //修改结点的next域
    };//带头结点的循环单链表
    template<class ElemType>
    class CirLinkList{private:LinkNode<ElemType> *head;   // 头结点LinkNode<ElemType> *tail;   // 尾结点public://无参数的构造函数CirLinkList(){head = new LinkNode<ElemType>; tail = head; head->next = head;head->used=1;}//带参数的构造函数CirLinkList(const ElemType &item){head = new LinkNode<ElemType>(item); tail = head; head->next = head;}//拷贝构造函数CirLinkList(CirLinkList<ElemType> &List);//析构函数~CirLinkList(){ListDestroy();}//销毁链表void ListDestroy();//清空链表void ListClear();//返回链表的长度int ListLength() const;//判断链表是否为空表bool ListEmpty() const;//获取循环链表头结点LinkNode<ElemType>* GetHead() { return head;}//获取循环链表尾结点LinkNode<ElemType>* GetTail() { return tail;}//设置链表头结点void SetHead(LinkNode<ElemType> *p){ head = p;}//在链表的第pos个位置之后插入e元素bool ListInsert_next(int pos,ElemType e);//在首结点之前插入一个结点bool InsFirst( ElemType &e );//在尾结点之前插入一个结点void InsTail( ElemType &e ,int num);//表头插入法动态生成链表void CreateList_Head(vector<ElemType> &A);//表尾插入法动态生成链表void CreateList_Tail(vector<ElemType> &A);//遍历链表void ListTraverse() const;
    };
    template<class T>
    void CirLinkList<T>::ListDestroy()
    {auto t=head;auto p=head;while(t!=p){delete head;t=t->next;}delete p;
    }
    template<class T>
    void CirLinkList<T>::ListTraverse()const
    {auto t=head->next;auto p=head;int cnt=0;while(t!=p){cnt++;if(t->used)cout<<"B";else cout<<"G";if(cnt>=50){cout<<endl;cnt=0;}t=t->next;}cout<<endl;
    }
    template<class T>
    void CirLinkList<T>::InsTail(T &e,int num)
    {auto s=new LinkNode<T>(e,num);s->next=head;tail->next=s;tail=s;
    }
    template<class T>
    void CirLinkList<T>::CreateList_Tail(vector<T> &A)
    {auto it=A.begin();for(it;it!=A.end();it++)InsTail(*it,(it-A.begin())+1);
    }template<class ElemType>
    void Joseph(CirLinkList<ElemType> &A, int m,int n)
    {auto t=A.GetHead();while(n){int cnt=0;while(cnt<m){t=t->next;if(t->used==0)cnt++;}t->used=1;n--;}A.ListTraverse();cout<<endl;
    }
    int main()
    {int n,m;vector<int> a;cin>>n;cin>>m;for(int i=1;i<=2*n;i++)a.push_back(i);CirLinkList<int> A;A.CreateList_Tail(a);Joseph(A,m,n);return 0;
    }
    

DHU数据结构-循环单链表-ADT应用-圆桌问题相关推荐

  1. 数据结构-循环单链表之魔术师发牌问题

    问题描写叙述: 魔术师手中有A.2.3--J.Q.K十三张黑桃扑克牌.在表演魔术前,魔术师已经将他们依照一定的顺序叠放好(有花色的一面朝下).魔术表演过程为:一開始,魔术师数1,然后把最上面的那张牌翻 ...

  2. 数据结构-循环单链表之约瑟夫问题

    约瑟夫问题的由来: 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定 ...

  3. DHU数据结构-单链表-ADT应用-长整数加法运算(使用单链表存储计算结果)

    目录 1.题目 2.题解 3.代码实现 1.题目 单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果) 作者: 冯向阳 时间限制: 1S 章节: DS:线性表 问题描述 : 目的:使 ...

  4. 【数据结构】线性表的链式表示-循环单链表、循环双链表、静态链表

    循环单链表 从任何一个结点出发都能访问到链表的每一个元素 判空条件不是头节点的后继指针是否为空,而是它是否等于头指针 有时对单链表常做的操作实在表头和表尾进行的,此时可对循环单链表不设头指针而仅设尾指 ...

  5. 【数据结构】循环单链表的实现(C语言)

    循环单链表应掌握以下基本操作: 1.建立一个空的循环单链表. 2.获得循环单链表的最后一个结点的位置. 3.输出循环单链表中各结点的值. 4.在循环单链表中查找值为x的结点. 5.在循环单链表中第i个 ...

  6. 【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)

    所实现的循环单链表的结构例如以下图所看到的: 循环单链表的实现,和上一篇文章单链表的实现大致同样点击打开链接,略有差别: 1:循环推断的条件不再是s == NULL或者s->next == NU ...

  7. (王道408考研数据结构)第二章线性表-第三节3:循环单链表和循环双链表

    文章目录 一:循环链表定义 二:循环单链表 三:循环双链表 一:循环链表定义 循环链表:规定好头尾结点的指向形成成环状 循环单链表:其尾节点的next指针由原本的空改为指向头结点 循环双链表:其尾节点 ...

  8. 数据结构之python实现循环单链表实例

    题目如下: python实现: import random class CLNode:def __init__(self,name):self.name = nameself.next = None ...

  9. 王道书 P41 T19(循环单链表实现)

    /*** 用链表实现 王道P41 T19** ①算法思想:* 不断地从 L 中找到最小值输出并删除,* 直到 L -> NEXT = L 结束.** ②数据结构:* typedef struct ...

最新文章

  1. spring security源码分析之web包分析
  2. 汇总常用的jQuery操作Table tr td方法
  3. dreamweaver 8的替换功能
  4. hdu 2570 (贪心)
  5. windows 64位PHP5.5配置xhprof
  6. MYSQL索引和权限管理
  7. 《MATLAB智能算法超级学习手册》一一1.5 简单工程应用分析
  8. python———两个栈实现一个队列
  9. Ms08067年度技术文集合
  10. 虚拟机ip、主机ip、代理ip
  11. 学信网忘记原手机号码的解决办法
  12. 3行代码,搞定AI自动抠图
  13. 不要高估你和任何一个人的关系
  14. pyinstxtractor.py 的改进 - 反编译pyinstaller生成exe的工具
  15. 新闻发布系统——主页面分页
  16. 2020年中国经济蓝皮书(第四部分)
  17. 3dTile技术研究-概念详述(5)
  18. 2020笔记本选购推荐
  19. clusterProfiler安装
  20. 详解操作系统的运行机制

热门文章

  1. Guiding Teacher Forcing with Seer Forcing for Neural Machine Translation翻译
  2. 四则运算——单元测试(测试方法:Right-BICEP )
  3. [情侣空间] 基于spring boot的自制情侣空间
  4. 做软件测试有前途么?
  5. matlab英文文本信息量,实验一英文文本信息量的计算-Read.doc
  6. 认识计算机教案流程图,流程图教案信息技术.doc
  7. Android绘制优化(二)布局优化
  8. 在英文论文写作中,什么时候该用斜体?
  9. 使用AUI框架开发微信小程序
  10. Android手机安装原版BT5[ARM]