- /*
- 耶稣有15个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:
- 15人围坐一圈,从第一个开始报号:1,2,3,1,2,3……,凡是报到“3”就退出圈子,
- 最后留在圈内的人就是出卖耶稣的叛徒,请找出它原来的序号。
- */
- #include<stdio.h>
- #include<stdlib.h>
- //定义节点
- typedef struct _node{
- int num;
- struct _node *next;
- }Node;
- //定义链表
- typedef struct _list{
- Node *head;
- Node *tail;
- }List;
- int main(){
- List list;
- list.head = list.tail = NULL;
- int i;
- //做15个节点,每个节点的num属性就是门徒的标号,从1到15.
- for (i =0; i < 15; i++){
- Node *p = (Node *)malloc(sizeof(Node));
- p->num = i + 1;
- p->next = NULL;
- if (list.tail){
- list.tail->next = p;
- list.tail = p;
- }else {
- list.head = list.tail = p;
- }
-
- }
- //把链表头尾连起来
- list.tail->next = list.head;
- //指针 p,q遍历,q在p前面一个节点
- Node *p = list.head;
- Node *q = NULL;
- //按照数到3就删除节点的顺序,
- for (i = 2; ; i++){
- // i=2的时候,q在1,p在2
- q = p;
- p = p->next;
- //如果p的下一个就是自己,说明链表里只有1个节点了,结束循环。
- if (p->next == p){
- printf("last = %d", p->num);
- break;
- }
- //i被3整除就删除节点,同时输出 删除的节点num
- if (i % 3 == 0){
- q->next = p->next;
-
- printf("delete%d\n", p->num);
- }
- }
- return 0;
- }
复制代码 |