今天花几小时完成了数据结构的实验题,里面实现了循环单链表的构建,节点的删除。

          但说句实话,里面的执行函数我写的时候就有点别扭,觉得不太好,有点混乱,虽然最终还是实现出来了,供大家参考,也希望有朋友指点改进一下!

          编译结果:

                           

                 源代码:

#include<iostream>
using namespace std;
int T=1;//定义一个全局变量T用以计算操作次数
//定义一个约瑟夫节点结构体j_node
//------------------------------
struct j_node
{ int data;   //节点保存的数据 j_node *next; //指向下一节点的指针
};
//循环链表的赋值
//---------------------
j_node *Initnode(int n) //参数n是总共的节点数
{ int temp_date = 0; int i = 0; j_node *head; //定义节点的头指针 j_node *p;    head=p=new j_node;  //新创建节点 cout<<"请输入"<<n<<"个数字:"<<endl; for(i=1; i<=n; i++) { cout<<"第"<<i<<"个:"; cin>>temp_date;             //输入的节点数据temp p->data=temp_date;           //将输入的节点数据赋值给节点 if(i < n) { p->next=new j_node;      //节点指针指向新创建的节点 p=p->next; //指针后移 } else if(i == n) { p->next=head;  //已经到达尾节点,让其指向头结点,以构成循环链表 break; } } cout<<p->next->data<<endl;//将尾节点的下一节点输出,以验证是否构成循环链表 return head;//返回头指针
}
//------------------
//链表输出函数
void Output_node(j_node *head, int n)  //参数分别是头指针head,节点总数n
{ j_node *p; p = head; for(int i=0; i<n; i++) { cout<<p->data<<" "; p = p->next; } cout<<endl;
}
//-------------------------------
//执行函数
void Done(j_node *head,int n, int a, int b) //参数分别是头指针head,节点总数n,第一个报数的号l,报数的号码m
{ j_node *p;     //计数指针 j_node *front; //存放删除前节点 j_node *back;  //存放删除后节点 j_node *del;   //存放删除节点 j_node *new_head;//存放新的头指针 p = front = head; //----------------- //这个for循环作用:找出第一个报数的节点 for(int i=1; i<b; i++) { front = p; p = p->next; } //---------------- while(head!=NULL) { //判断当n==1时,也就是链表剩下最后一个节点时,结束删除 if(n==1) { cout<<"最后一个报数的是:"<<head->data<<endl; cout<<"问题已解决!"<<endl; return; } //------------------------------- //这个for循环的作用是找出要删除的节点,及其后的节点 for(i=0;i<a;i++,p = p->next) {  if(i==a-2) { front=p;//要删除的前一个节点 } del = p;//要删除的节点 back = p->next;//要删除的后一个节点 } //------------------------------------ front->next=back;//要删除的前节点指向要删除的后节点 //------------ //判断如果要删除的是头结点的话,就让del->next成为新的头结点 if(del==head) { new_head=del->next; head = new_head;//新的头结点赋值给头结点 } cout<<"第"<<T<<"次删除的节点是:  "<<del->data<<endl; delete del;//删除节点 n--;//链表的长度减一 cout<<"第"<<T<<"次操作之后的链表是:  "; T++; Output_node(head,n);//输出删除节点后链表的情况 cout<<endl; p = back; //让删除节点的后一个付给p,以构成循环计算 }
}
//--------------------------
//主函数
int main()
{ j_node *head;    int a,n,b; char c; while(1) { cout<<endl; cout<<"请分别输入总人数 n:"<<endl; cin>>n; head=Initnode(n);//头结点指向初始化好的循环链表 cout<<"所创建的链表为:"<<endl; Output_node(head,n); cout<<"请输入第一个报数的号码:"<<endl; cin>>b; cout<<"请输入报的号数:"<<endl; cin>>a; if(b>n) { cout<<"输入报数的号码不合法!"<<endl; cout<<"请再次输入: "; cin>>a; } Done(head,n,a,b); cout<<"是否再来一次(Y or N): "; cin>>c; if(c=='N') exit(0); else continue; } return 0;
}

转载于:https://blog.51cto.com/listentome/1337407

约瑟夫问题(c++)相关推荐

  1. python中约瑟夫环程序_Python实现约瑟夫环问题的方法

    本文实例讲述了Python实现约瑟夫环问题的方法.分享给大家供大家参考,具体如下: 题目:0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的 ...

  2. 约瑟夫环问题的两种解法(详解)

    约瑟夫环问题的两种解法(详解) 题目: Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆 ...

  3. 用C++实现约瑟夫环的问题

    约瑟夫问题是个有名的问题:N个人围成一圈.从第一个開始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉. 比如N=6,M=5.被杀掉的人的序号为5,4,6.2.3.最后剩下1号. 假定在圈子里前K ...

  4. 约瑟夫死亡游戏算法问题

    代码: #include<iostream> #include<stdlib.h> using namespace std; typedef int datatype; typ ...

  5. 链表问题6——环形单链表的约瑟夫问题(初阶)

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

  6. P1996 约瑟夫问题

    题目背景 约瑟夫是一个无聊的人!!! 题目描述 n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,--依次类推,直到所有的人都出 ...

  7. 五、单向环形链表---实现约瑟夫(Josephu)问题

    使用单向环形链表实现约瑟夫(Josephu)问题 1.约瑟夫(Josephu)问题描述 Josephu 问题为:设编号为 1,2,- n 的 n 个人围坐一圈,约定编号为 k(1<=k<= ...

  8. python约瑟夫环问题给十个学生编号报到3者出列_趣味算法--约瑟夫环问题(示例代码)...

    问题描述 已知n个人(以编号1,2,3,...,n分别表示)围坐在一张圆桌上.指定编号为k的人开始从1报数,数到m的那个人出列:出列那个人的下一位又从1开始报数,数到m的那个人出列:以此规则重复下去, ...

  9. 一文读懂约瑟夫环算法

    2020-05-25 20:13:40 作者 | 扬帆向海 责编 | 王晓曼 出品 | CSDN博客 问题描述 约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的 ...

  10. 约瑟夫问题(优化优化再优化)

    1 什么是约瑟夫问题 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围. 从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的 ...

最新文章

  1. 3.4_函数_Function_Part_2
  2. __getitem__的作用
  3. 前端编码规范,个人感觉bootstrap总结的不错,拿出来给大家分享
  4. linux查看某端口进程占用,Linux下查看某端口占用进程
  5. 【PAT甲级 火星数字】1100 Mars Numbers (20 分)Java 全部AC
  6. 单机简单搭建一个kafka集群(没有进行内核参数和JVM的调优)
  7. java 运行管理-基础
  8. mysql中起飞到达城市查询_让mysql慢慢起飞 - 初识慢日志
  9. AKKA Inbox收件箱
  10. Python爬虫爬取快代理上的免费代理
  11. 50个面试官最喜欢问的java微服务面试题
  12. 抛物线交点式公式_抛物线公式大全
  13. 静态ip设置失败解决办法
  14. 求一个序列所有区间不同数的个数之和
  15. 北京大学C语言学习第8天
  16. 极客日报:腾讯反舞弊通报近 70 人被辞退;库克遭陌生可疑女子威胁;英伟达回应放弃收购 ARM 传闻
  17. Factory Methods
  18. 关于Office弹窗+横幅提示“你的许可证不是正版,并且你可能是盗版软件的受害者...”的解决方案——以Office2019为例
  19. 计算机程序设计理论知识,计算机程序设计员理论知识试卷
  20. 记录一下获取的动态ip与路由器ip不符所以要纠错的日常

热门文章

  1. MongoDB配置文件
  2. 【转】android开发工具Eclipse,androidStudio,adt网盘下载--不错
  3. ThreadGroup
  4. android开发技术博客
  5. 不要相信修改注册表EnablePrefetcher文件达到加速开机速度的说法
  6. Adobe Achemy入门指南(二)
  7. MDaemon使用技巧大全--新建账户欢迎文件的设置
  8. 英语是缺乏AOP的语言,汉语是具备AOP的语言。
  9. 2019年企业新增长 从雇佣“机器人员工”开始
  10. POJ 3461 还是两种方法