#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int item;
struct node *next;
}node;
node *head = NULL;
node *mk_node(int item)
{
node *p = (node *)malloc(sizeof(node));
if (p == NULL)
{
printf("malloc failed!\n");
exit(1);
}
p->item = item;
p->next = NULL;
return p;
}
void free_node(node *p)
{
free( p );
}
void init(int n) //链表的初始化
{
int i;
node *p;
node *tail; //定义尾节点,方便指向头(伪循环)
head = mk_node(1);
tail = head;
for (i = 1; i < n; i++)
{
p = mk_node(i + 1);
tail->next = p;
tail = p;
}
tail->next = head;
}
int josph() //踢出第三个(算法实现)
{
int total = 1;
node *pre = head;
node *p;
int last;
while (pre->next != pre)
{
total++;
if (total == 3)
{
p = pre->next;
printf("%d\n", p->item);
pre->next = p->next;
free_node(p);
total = 1;
}
pre = pre->next;
}
last = pre->item;
free_node(pre);
return last;
}
int main(int argc, char *argv[])
{
int n;
int last;
int *people;
if (argc < 2)
{
printf("usage:./a.out num\n");
exit(1);
}
n = atoi(argv[1]);
init(n);
last = josph();
printf("the survival is %d\n", last);
return 0;
}