循环链表与约瑟夫问题
2014-08-10 16:30
295 查看
n个人围坐一桌,从编号m开始数,数到k就取出,从k的下一个人开始又从m开始数......知道所有的去掉,输出结果为:从第一次开始到最后一次的数字
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
//定义一个n个节点的链表,无头结点的循环链表
typedef struct LNode
{
int datda;
struct LNode *LNode;
}LNode, *LinkList;
//定义这个函数
void JOSEPHUS(int n,int m,int k)
{
/*
p为当前节点,r为辅助节点,指向p的前驱节点,list为头结点
*/
LinkList p,r,list,curr;
/*建立循环链表*/
p=(LinfList)malloc(sizeof(LNode));
p->data=0;
p->link=p;
curr=p;
for(int i=1;i<n;i++)
{
LinkList t=(LinkList)malloc(sizeof(LNode));
t->data=i;
t->link=curr->link;
curr->link=t;
curr=t;
}
/*
把当前指针移动到第一个报数的人
*/
r=curr;
while(k--) r=p,p=p->link;//因为是循环的,所以从最后一个数字开始,向前推进k次,就一定能到达数字k
while(n--)
{
for(int s=m-1;s--;r=p,p->link)
r->link=p->link;
printf("%d->",p->data);
free(p);
p=-r->lik;
}
}
int mian()
{
JOSEPHUS(13,4,1);
}
有两点值得注意:1)在家里循环链表后,给循环链表赋值的时候,想要找到值为k的数字,直接往前推进K个位置就可以,因为这是循环链表
2)想要删除第m个人,也是一直往前推进m-1就可以了,因为这是循环链表
运行结果:
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
//定义一个n个节点的链表,无头结点的循环链表
typedef struct LNode
{
int datda;
struct LNode *LNode;
}LNode, *LinkList;
//定义这个函数
void JOSEPHUS(int n,int m,int k)
{
/*
p为当前节点,r为辅助节点,指向p的前驱节点,list为头结点
*/
LinkList p,r,list,curr;
/*建立循环链表*/
p=(LinfList)malloc(sizeof(LNode));
p->data=0;
p->link=p;
curr=p;
for(int i=1;i<n;i++)
{
LinkList t=(LinkList)malloc(sizeof(LNode));
t->data=i;
t->link=curr->link;
curr->link=t;
curr=t;
}
/*
把当前指针移动到第一个报数的人
*/
r=curr;
while(k--) r=p,p=p->link;//因为是循环的,所以从最后一个数字开始,向前推进k次,就一定能到达数字k
while(n--)
{
for(int s=m-1;s--;r=p,p->link)
r->link=p->link;
printf("%d->",p->data);
free(p);
p=-r->lik;
}
}
int mian()
{
JOSEPHUS(13,4,1);
}
有两点值得注意:1)在家里循环链表后,给循环链表赋值的时候,想要找到值为k的数字,直接往前推进K个位置就可以,因为这是循环链表
2)想要删除第m个人,也是一直往前推进m-1就可以了,因为这是循环链表
运行结果:
相关文章推荐
- 面试题之约瑟夫问题-----循环链表简单详述
- (2011.11.20)02_循环链表举例_约瑟夫(Joseph)环问题.cpp
- 约瑟夫问题(没有头节点的循环链表)
- [1197]约瑟夫问题 (循环链表)SDUT
- [1197]约瑟夫问题 (循环链表)SDUT
- 约瑟夫问题-循环链表
- 用循环链表解决约瑟夫问题
- SDUTOJ 1197 约瑟夫问题——循环链表解法数学解法和循环队列
- 约瑟夫问题的数学角度分析 C 数组实现 循环链表实现 递归实现时间复杂度O(logN)
- 约瑟夫问题——循环链表
- 用循环链表解决约瑟夫(josephu)问题
- 数据结构学习中的简单问题(二):用循环链表求解简单约瑟夫问题
- 用循环链表实现约瑟夫问题
- 约瑟夫问题(带头节点的循环链表)
- C++循环链表实现约瑟夫问题
- 约瑟夫问题-----循环链表
- Josephus(约瑟夫)问题----分别用循环链表和数组实现
- 基于循环链表的约瑟夫问题
- 约瑟夫问题--循环链表实现
- 排队(约瑟夫问题)用循环链表解决