zoukankan      html  css  js  c++  java
  • 约瑟夫问题

    设编号分别为:1,2,...,n的n个人围坐一圈。约定序号为k(1 <= k < = n)的人从1开始计数,数到m的那个人出列,他的下一位又从1开始计数,数到m的那个人又出列,依次类推,直到所有人出列为止。

    #include <stdio.h>
    #include <stdlib.h>
    //思路:用循环链表实现
    typedef struct node
    {
        int data;
        struct node *next; //不要忘记struct
    }node;
    //第一步:先建立带头结点的环形链表模拟人围成的环,返回第一个结点的指针
    node* create(int n)
    {
        node *p,*head; //p指针为位移标记指针,head指针为头指针
        head = (node*)malloc(sizeof(node));//生成头结点
        p = head; //p指针指向头结点
        node *s;
        int i;
        for(i=1; i<=n; i++)
        {
            s = (node*)malloc(sizeof(node));//生成新结点
            s->data = i; //s结点的data域存放序号
            p->next = s;//p的next域指针指向下一个结点
            p = s; //p指针位移指向下一个结点
        }
    
        s->next = head ->next; //最后一个结点的next域指向第一个结:形成环
        free(head);
        return s->next; //返回第一个结点的指针
    }
    int main()
    {
        int n,m;//一共n个人 数到m的人出局
        scanf("%d %d",&n,&m);
        node *p;
        p = create(n);  //指向第一个结点的指针
    
        //第二步:数到m的人出局
        int i,a;
        node *temp;
        a=n%m;//每次都数3个数即m=3  所以对3取余
        while(p!=p->next)
        {
            for(i=1; i<a; i++)
            {
                p=p->next;//运动指针:指向待删除结点的前一个结点!
            }
            temp=p->next; //temp指针为待删除位置!
            printf("%d->",temp->data);//输出删除的结点data值
            p->next = temp->next;//如果m=3则第二结点next域指向第四个位置
            p = temp->next;//p指向下一个首结点
        }
        printf("%d",p->data);
        return 0;
    }
  • 相关阅读:
    怎么看到数据库以前做过的日志?
    感觉很好的网站
    uview 滑动切换
    Flyweight享元(结构型模式)
    悟空,真的是空?
    Interpreter解释器(行为型模式)
    Proxy代理(结构型模式)
    [转]有一种爱叫索取
    Command命令(行为型模式)
    Composite组合(结构型模式)
  • 原文地址:https://www.cnblogs.com/qingfengzhuimeng/p/6433062.html
Copyright © 2011-2022 走看看