c实现循环链表
2024-09-05 04:37:25
解决约瑟夫环问题核心步骤:
1.建立具有n个节点、无头的循环链表
2.确定第一个报数人的位置
3.不断从链表中删除链节点,直到链表为空
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std; typedef struct lnode
{
int data;
struct lnode *link;
}lnode; /**
* @brief 约瑟夫环问题:
* n 个人,编号为 1,2,...,n
* 从编号K的人开报数(从1开始)
* 喊道 m 的人出列,也就是:从 1 数到 m,
*
* @param total 总人数
* @param start 确定第一个开始报数的人编号
* @param outnum 指定出列者喊到的数
*/
void JOSEPHUS(int total, int start, int outnum)
{
//1. 定义变量
lnode *p;
lnode *r;
lnode *curr; //curr 指向尾, curr->link 指向头 //2. 建立第一个节点
p = (lnode*)malloc(sizeof(lnode));
p->data = ;
p->link = p;
curr = p; //3. 建立循环链表
for (int i=; i<=total; i++)
{
lnode *t = (lnode*)malloc(sizeof(lnode));
t->data = i;
t->link = curr->link;
curr->link = t;
curr = t;
printf("%d\n", i);
} //4. 指针移动到第一个报数的人
while (start--)
{
r = p;
p = p->link;
} //5. 开始遍历删除
while (total--)
{
//定位删除点
for (int s=outnum-; s--; r=p,p=p->link); printf("%d->", p->data); //删除节点
r->link = p->link;
free(p);
p = r->link;
}
printf("\n");
} int main()
{
int total = ; //总人数
int start = ; //确定第一个开始报数的人编号(1,2,...)
int outnum = ; //指定出列者喊到的数 JOSEPHUS(total, start, outnum);
}
最新文章
- sudo命令使用的几个场景
- 【Alpha】团队贡献分配计划
- gitignore for vs
- 手机金属外壳加工工艺:铸造、锻造、冲压、CNC
- Scala语言专题
- android studio环境搭建-笔记1
- break与continue
- 安装Eclipse Html Editor
- BZOJ 1901: Zju2112 Dynamic Rankings( BIT 套 BST )
- android 实现代码关机
- Android模拟器
- 浏览器的同源策略及CORS跨域解决方案 DRF
- 未能加载文件或程序集“System.Web.Mvc, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项
- HTTP协议概念与特点,HTTP的状态码,HTTPS是什么?
- enctype=";multipart/form-data";表单传值问题
- PHP类多继承的替代方案Traits
- 不光是查找值! ";二分搜索";
- Revit Family API 添加参数与尺寸标注
- [运维-安全]CentOS7.0环境下安装kangle和easypanel
- egret 精简游戏项目