双向链表约瑟夫问题.c

#include <stdio.h>
#include <stdlib.h>

typedef int datatype;
typedef struct node_t
{
    datatype data;
    struct node_t * prior;
    struct node_t * next;
}link_node_t,*link_list_t;

typedef struct doublelinklist
{
    link_list_t head;
    link_list_t tail;
}double_node_t,*double_list_t;

int main(int argc, const char *argv[])
{
    int i;
    int all_num = 8;//猴子总数
    int start_num = 3;//从3号猴子开始数
    int kill_num = 3;//数到几杀死猴子 
    link_list_t h = NULL;
    link_list_t pdel = NULL;//用来指向被杀死猴子的节点
    printf("请您输入猴子的总数,开始号码,出局号码:\n");
    scanf("%d%d%d",&all_num,&start_num,&kill_num);
    //1.创建一个双向的循环链表
    double_list_t p = (double_list_t)malloc(sizeof(double_node_t));//申请头指针和尾指针
    if(NULL == p)
    {
        perror("malloc failed");
        return -1;
    }
    p->head = p->tail = (link_list_t)malloc(sizeof(link_node_t));
    if(NULL == p->tail)
    {
        perror("p->tail malloc failed");
        return -1;
    }
    p->head->data = 1;
    p->head->prior = NULL;
    p->head->next = NULL;
    //将创建n个新的节点,链接到链表的尾
    for(i = 2; i <= all_num; i++)
    {
        link_list_t pnew = (link_list_t)malloc(sizeof(link_node_t));
        if(NULL == pnew)
        {
            perror("pnew malloc failed");
            return -1;
        }
        pnew->data = i;
        pnew->prior = NULL;
        pnew->next = NULL;
        //(1)将新的节点链接到链表的尾
        p->tail->next = pnew;
        pnew->prior = p->tail;
        //(2)尾指针向后移动,指向当前链表的尾
        p->tail = pnew;
    }
    //(3)形成双向循环链表 
    p->tail->next = p->head;
    p->head->prior = p->tail;
    //调试程序 
#if 0
    while(1)
    {
        printf("%d\n",p->head->data);
        p->head = p->head->next;
        sleep(1);
    }
#endif
    //2.循环进行杀死猴子
    h = p->head;
    //(1)先将h移动到start_num处,也就是开始数数的猴子号码处
    for(i = 0; i < start_num-1; i++)
        h = h->next;
    while(h->next != h)//当h->next == h 就剩一个节点了,循环结束
    {
        //(2)将h移动到即将杀死猴子号码的位置
        for(i = 0; i < kill_num-1; i++)
            h = h->next;
        //(3)进行杀死猴子,经过上面的循环后,此时的h指向即将杀死的猴子
        h->prior->next = h->next;
        h->next->prior = h->prior;
        pdel = h;//pdel指向被杀死猴子的位置
        printf("kill is -------%d\n",pdel->data);
        h = h->next;//需要移动,从杀死猴子后的下一个位置开始数
        free(pdel);
    }
    printf("猴王是%d\n",h->data);
    return 0;
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值