首页 > Josephus问题

Josephus问题

目的:练习下单链表和指针 (OS 10.7 + Xcode 4.2)

代码如下:

 1 #include 
 2 #include 
 3 
 4 typedef struct lnode
 5 {
 6     int data;
 7     struct lnode *next;    
 8 }lnode;
 9 
10 int main(void)
11 {
12     int n,fire_num;
13     
14     //输入相关参数并检测合法性
15     printf("请输入参与人数: ");
16     scanf("%d", &n);
17     int mark = 1;
18     while (mark)
19     {
20         if (n < 1) 
21         {
22             printf("代码……解析……错误……杀人程序不予启动!请重新输入参与人数:");
23             scanf("%d", &n);
24             continue;
25         }
26         else mark = 0;
27     }
28     printf("请输入杀手代码: ");
29     scanf("%d", &fire_num);
30     mark = 1;
31     while (mark)
32     {
33         if (fire_num < 1) 
34         {
35             printf("代码……解析……错误……杀人程序不予启动!请重新输入杀手代码:");
36             scanf("%d", &fire_num);
37             continue;
38         }
39         else mark = 0;
40     }
41     
42     //建立一个无头、尾节点的循环链表
43     struct lnode *p = malloc(sizeof(lnode));
44     p->data = 1;
45     struct lnode *q = p;
46     for (int i = 2; i <= n; ++i)
47     {
48         struct lnode *tmp = malloc(sizeof(lnode));
49         tmp->data = i;
50         tmp->next = NULL;
51         q->next = tmp;
52         q = tmp;
53     }
54     q->next = p;
55     
56     //链表建立完毕,p始终指向q的前驱节点,r用于释放节点空间
57     int i = 1;
58     while (p->next != q)
59     {
60         while ( i != fire_num)
61         {
62             q = p;
63             p = p->next;
64             ++i;
65         }
66         struct lnode *r;
67         q->next = p->next;
68         r = p;
69         p = p->next;
70         free(r);        
71         if (i == fire_num)
72         {
73             i = 1;
74         }
75     }
76     
77     //最后剩下两个节点,独立判断生还者。其中计数循环始终从p指向节点开始
78     if (fire_num % 2 ==0)
79     {
80         printf("还剩下一位生还者,其编号为%d。如需继续处理,请启动终结者模式!
", p->data);
81     }
82     else
83         printf("还剩下一位生还者,其编号为%d。如需继续处理,请启动终结者模式!
", q->data);
84     
85     return 0;
86 }

还剩两个节点时,没想到什么好办法,单独拿出来计算吧~~~

转载于:https://www.cnblogs.com/youngsing/archive/2012/11/01/2750277.html

更多相关:

  • 题目:合并两个排序的链表 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 示例1: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 限制: 0 <= 链表长度 <= 1000 解题: /*** Definition for singly-linked li...

  • 题目:反转链表 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 限制: 0 <= 节点个数 <= 5000 解题: 方法一:双指针 我们可以申请两个指针,第一个指针叫 new_next,最...

  • LRU算法(Least Recently Used) 算是我们经常遇到的一种淘汰算法,其中内存管理模块进行内存页回收时有用到,针对不经常使用的内存页,LRU淘汰策略能够将该内存页回收给操作系统。 属于 我们操作系统设计中的 时间局部性原理,最长时间未被访问的数据优先淘汰,当内存中已存在的数据再次被访问时,则进行热度的提升。 本文为...

  • 题目描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 方法一(递归): 将配对交换过程拆解为多个以两个元素为一对的子问题 …n(k-1) -> n(k)->n(k+1)...

  • 已知两个已排序链表头节点指针headA与headB,将这两个链表合并,合并后仍为 有序的,返回合并后的头节点。 主要步骤如下: 创建一个临时的头节点,头节点每次指向headA 或者 headB较小的节点当headA->data 比headB->data小的时候,headA的当前节点加入临时头节点,同时headA指针向后移动;否则h...