回 帖 发 新 帖 刷新版面

主题:高手们帮忙啊!!!

Josephu问题为: 设编号为 1,2,….,n的n个人顺时针围成一圈, 每个人除有编号外, 还持有密码, 且已给定初始密码m, 约定从编号为 k (1≤k≤n) 的人从1 开始报数, 数到 m的那个人出列, 取出它的密码作为新的密码m, 它的下一位又从1开始报数,数到m的那个人出列, 依此类推,直到所有人出列为止, 试输出出队者的编号序列.(分别用顺序存储结构和链式存储结构实现.)
例: n=4, k=1,初始密码m=2 
 例如:1# 3 2# 5 3# 2 4# 4  
   则出队者的编号序列: 2,4,3,1
解:
法一. 顺序存储结构: ( 上例用如下数组A[n ]存放)
 num   cord
  1   3
  2   5
  3   2
  4   4
其中: num 存放某人的编号
     cord 存放某人的密码
1. 设当前人数为N (其初值是n )
当前密码为m (其初值是初始密码)
当前报数人地址为i, (其初值是k-1)
2. 计算报到m的人地址:  i=(i+m-1)%N
  输出A[i].num, 且A[i].cordm
  删除元素A[i ],人数N减1
3. 反复2. 直到N为0为止

法二. 链式存储结构:
建立一个不带附加表头结点的单链表,头指针H指向最后一个结点,
每一个结点为:
      num cord  next
        
     其中: num 为编号
cord 为密码
next 为下一个结点地址

1. 设P指向当前报数人的前一个结点,(初值为H)
M为当前报数密码(初值为m)
n为总人数
2.进行n-1步如下操作:
将指针P后移M-1步,让P正好移到要报数为M的人的前一个结点,
输出Pnextnum, M=Pnextcord, 删除Pnext所指结点
3. 输出P->num

回复列表 (共4个回复)

沙发

如果是求实现的话就算了
这是基本功
如果这个程序写不出就真的劝你放弃学习数据结构吧
教科书上都会有最基础的JOSEPH表的程序的,照着改来就OK了

板凳

哦,谢谢了!
请问哪本教科书书上有,反正我们用的没
下次到图书馆找找

3 楼

高教出版社的《算法与数据结构》

4 楼

谢谢啦!!!
我是初学者,不懂的地方还很多,
以后慢慢再向你请教

我来回复

您尚未登录,请登录后再回复。点此登录或注册