约瑟夫环,链表方法。

#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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值