约瑟夫环问题 (用循环链表解决)
2012-03-06 15:13
246 查看
/*
已知N个人围坐在一张圆桌周围,从编号为k的人开始报数,数到m的那个人出列,他的下
一个人又从1开始报数,数到m的那个人又出列,以此规则重复下去,直到圆桌周围的全
部出列.
基本思想
(1),建立一个具有n个链结点且不带头结点的循环链表
(2),确定第一个报数点的位置
(3),不断地从链表中删除一个链结点,直到链表中还有一个链结点止
*/
#include <stdio.h>
#include <malloc.h>
struct list
{
int data;
struct list *link;
};
void josephus(int n, int m, int k)
{
struct list *p, *r, *list = NULL;
int i;
//list 为第一个结点
for (i = 1; i <= n; i++)
{
p = (struct list *)malloc(sizeof(struct list));
p->data = i;
if (list == NULL)
list = p;
else
r->link = p;
r = p;
}
p->link = list;//建立一个循环链表 指向第一个结点
p = list;//p为首节点
for (i = 1; i < k; i++)
{
r = p;
p = p->link;
}//此时p指向第一个出发结点(即第k处)
while (p->link != p)//循环结束条件为只剩下最后一个节点
{
for (i = 1; i < m; i++)
{
r = p;
p = p->link;
}//p指向第m个结点,r指向第m-1个结点
r->link = p->link;//删除第M个结点
printf("%4i", p->data);
free(p);
p = r->link;
}
printf("/n最后被删除结点是%4i/n", p->data);
}
int main(void)
{
josephus(8, 4, 9);
return 0;
}
已知N个人围坐在一张圆桌周围,从编号为k的人开始报数,数到m的那个人出列,他的下
一个人又从1开始报数,数到m的那个人又出列,以此规则重复下去,直到圆桌周围的全
部出列.
基本思想
(1),建立一个具有n个链结点且不带头结点的循环链表
(2),确定第一个报数点的位置
(3),不断地从链表中删除一个链结点,直到链表中还有一个链结点止
*/
#include <stdio.h>
#include <malloc.h>
struct list
{
int data;
struct list *link;
};
void josephus(int n, int m, int k)
{
struct list *p, *r, *list = NULL;
int i;
//list 为第一个结点
for (i = 1; i <= n; i++)
{
p = (struct list *)malloc(sizeof(struct list));
p->data = i;
if (list == NULL)
list = p;
else
r->link = p;
r = p;
}
p->link = list;//建立一个循环链表 指向第一个结点
p = list;//p为首节点
for (i = 1; i < k; i++)
{
r = p;
p = p->link;
}//此时p指向第一个出发结点(即第k处)
while (p->link != p)//循环结束条件为只剩下最后一个节点
{
for (i = 1; i < m; i++)
{
r = p;
p = p->link;
}//p指向第m个结点,r指向第m-1个结点
r->link = p->link;//删除第M个结点
printf("%4i", p->data);
free(p);
p = r->link;
}
printf("/n最后被删除结点是%4i/n", p->data);
}
int main(void)
{
josephus(8, 4, 9);
return 0;
}
相关文章推荐
- C++循环链表解决约瑟夫环问题
- 循环链表解决约瑟夫环问题
- 链表的应用:利用无头结点循环链表解决约瑟夫环问题
- 循环链表解决约瑟夫环问题
- 循环链表解决约瑟夫环问题
- 循环链表--解决约瑟夫环问题
- 【数据结构】循环链表解决约瑟夫环问题
- 循环链表(解决约瑟夫环问题)(VS…
- C语言基于循环链表解决约瑟夫环问题的方法示例
- 用循环链表解决约瑟夫环问题
- 使用链表实现环结构以解决约瑟夫环问题
- 约瑟夫环问题(循环链表表示)
- 约瑟夫环问题(循环链表实现C)
- 华为机试—约瑟夫环替换计数器m(循环链表解决)
- 用循环链表解决Josehus问题
- 循环链表解决约瑟夫环问题
- 约瑟夫环问题的两种解决方式(递归求解和数组模拟求解)
- Java语言解决约瑟夫环问题(ArrayList实现)
- SBT解决约瑟夫环问题(poj3517)
- 利用数组解决约瑟夫环问题