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

代码如下:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 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。如需继续处理,请启动终结者模式!\n", p->data);
81     }
82     else
83         printf("还剩下一位生还者,其编号为%d。如需继续处理,请启动终结者模式!\n", q->data);
84     
85     return 0;
86 }

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

posted on 2012-11-01 20:53  youngsing  阅读(110)  评论(0编辑  收藏  举报