Chinaunix首页 | 论坛 | 博客
  • 博客访问: 133000
  • 博文数量: 44
  • 博客积分: 956
  • 博客等级: 准尉
  • 技术积分: 521
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-18 12:45
文章分类
文章存档

2012年(11)

2011年(33)

分类: C/C++

2011-12-20 18:31:37

约瑟夫问题:
     据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
 
这是一个循环链表的问题,将链表的尾节点的指针指向头结点,按照一定的条件将其中的元素取出,直到最后一个元素:
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define N 41
  4. #define STEP 3

  5. typedef struct _node_
  6. {
  7.     int data;
  8.     struct _node_ *next;
  9. }linknode, *linklist;

  10. int main(int argc, char *argv[])
  11. {
  12.     int i;
  13.     linklist p, q;
  14.     p = (linklist)malloc(sizeof(linknode));
  15.     p->data = 1;
  16.     q = p;

  17.     for(i=2; i<=N; i++){
  18.         q->next = (linklist)malloc(sizeof(linknode));
  19.         q = q->next;
  20.         q->data = i;    
  21.     }
  22.     q->next = p;

  23.     while(p->next != p){
  24.         for(i=0; i<STEP-2; i++)
  25.             p = p->next;
  26.         q = p->next;
  27.         p->next = q->next;
  28.         printf("%d ", q->data);
  29.         free(q);
  30.         p = p->next;
  31.     }
  32.     printf("%d \n", p->data);

  33.     return 0;
  34. }
阅读(1208) | 评论(0) | 转发(0) |
0

上一篇:数据结构(9)

下一篇:数据结构(10)

给主人留下些什么吧!~~