数据结构面试题:josephus排列,循环链表
2013-03-16 23:11
267 查看
Josephus问题
http://hi.baidu.com/yishugao/item/97c88c8bdd4ec058850fab55问题描述:设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m的人出列,然后从出列的下一个人开始报数,数到m的人又出列,如此重复,直到所有的人全部出列。Josephus问题是:对于任意给定的n,m,s,求出按出列次序得到的n个人员的顺序表。
输入:n,s,m。
输出:开始时n个人员的序列,按Josephus的方式后n个人员的序列。
存储结构:链式存储结构。
算法基本思想:建立单循环链表,然后对循环链表进行删除,使链表形成一新的循环链表,依次输出删除的元素。
#include "stdio.h"
#include "conio.h"
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*Linklist;
josephus(int n,int s,int m){
Linklist p,q,list;
int i;
list=NULL;
for(i=1;i<=n;i++)
{p=(Linklist)malloc(sizeof(LNode));
p->data=i;
printf("%d ",p->data);
if(list==NULL) {list=p;q=p;}
else q->next=p;
q=p;
}
printf("\n");
p->next=list;
p=list;
for(i=1;i<s;i++)
{q=p;p=p->next;}
while(p->next!=p)
{for(i=1;i<=m-1;i++)
{q=p;p=p->next;}
q->next=p->next;
printf("%d ",p->data);
free(p);
p=q->next;
}
printf("%d",p->data);
}
main()
{ int n,s,m;
printf("n,s,m=");
scanf("%d,%d,%d",&n,&s,&m);
printf("%d,%d,%d\n",n,s,m);
josephus(n,s,m);
getch();
}
相关文章推荐
- C语言数据结构之双向循环链表的实例
- 数据结构学习笔记 --- 线性表 (一些常见的关于链表的算法和面试题)
- 雅虎面试题─将两个双向循环链表中data值相同的结点删除
- 小猪的数据结构辅助教程——2.4 线性表中的循环链表
- 【数据结构】用C++实现双循环链表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)
- 数据结构--单向循环链表、双向循环链表
- 程序员面试题精选100题(33)-在O(1)时间删除链表结点[数据结构]
- 数据结构之循环双向链表java实现
- 数据结构-循环链表
- ※数据结构※→☆线性表结构(list)☆============单向循环链表结构(list circular single)(四)
- 数据结构学习之循环链表结构
- 数据结构--循环链表
- 数据结构示例之带头节点的、单循环链表
- 数据结构Java实现04----循环链表、仿真链表
- 数据结构与算法之六 双向链表和循环链表
- 算法与数据结构面试题(10)-颠倒链表
- 程序员面试题精选100题(33)-在O(1)时间删除链表结点[数据结构]
- 数据结构——循环链表、仅设尾指针的循环链表、约瑟夫环
- 数据结构之循环链表
- 数据结构面试题1.2.1-把二元查找树转变成排序的双向链表