目的:练习下单链表和指针 (OS 10.7 + Xcode 4.2)
代码如下:
1 #include2 #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 }
还剩两个节点时,没想到什么好办法,单独拿出来计算吧~~~