电脑软硬件应用网
当前位置: 电脑软硬件应用网 > 设计学院 > 网络编程 > C语言 > 正文
约瑟夫环C语言实现源代码
约瑟夫环C语言实现源代码
2010-3-24 9:06:58  文/xiaobao   出处:电脑软硬件应用网   

   前天笔试有个约瑟夫环的问题,怪不得人家没通知我面试,原来我的约瑟夫环做的确实有问题,昨天晚上又重新做了下,下面上源代码:

    /*

    file:osephu.cpp author:www.5dkx.com

    */

    #include <iostream>

    using namespace std;

    typedef struct Node{

    int sort;

    struct Node *next;

    }Link,*List;

    int Init(List *p); //初始化双链表

    int Insert(List *p,int key); //插入节点

    void Print(List p); //打印双链表

    void CreateOsep(List p,int n); //初始化约瑟夫环void osehup(List p,int m,int len,List Re); //计算约瑟夫环出列顺序,并存放在Re链表中

    int main()

    {

    int m,n;

    List p,Re;

    Init(&p);

    Init(&Re);

    cout<<"输入环大小: ";

    cin>>n;

    cout<<"输入地几个人出列: ";

    cin>>m;

    CreateOsep(p,n);

    cout<<"输入为: "<<endl;

    Print(p);

    osehup(p,m,n,Re);

    cout<<"出队顺序为:"<<endl;

    Print(Re);

    return 1;

    }

    //初始化

    int Init(List *p)

    {

    *p = (List)malloc(sizeof(Link));

    if(!(*p))

    {

    cout<<"初始化失败!"<<endl;

    return 0;

    }

    else

    {

    (*p)->next=*p;

    //(*p)->sort=1;

    }

    return 1;

    }

    //插入节点

    int Insert(List *p,int key)

    {

    List tmp = (List)malloc(sizeof(Link));

    if(!tmp)

    {

    cout<<"创建节点失败!"<<endl;

    return 0;

    }

    else

    {

    tmp->sort=key;

    tmp->next=(*p)->next;

    (*p)->next=tmp;

    *p=tmp;

    }

    return 1;

    }

 //创建约瑟夫环

    void CreateOsep(List p,int n)

    {

    List tmp=p;

    tmp->sort=1;

    for(int i=2;i<=n;i++)

    Insert(&tmp,i);

    }

    //约瑟夫环算法

    void osehup(List p,int m,int len,List Re)

    {

    int count=0;

    int allc=0;

    List tmp1=p;

    List tmp2=Re;

    List temp;

    while(allc<len)

    {

    count++;

    if(count == m)

    {

    temp = tmp1->next;

    if(allc==0) //如果是第一次出列

    tmp2->sort=temp->sort;

    else

    Insert(&tmp2,temp->sort);

    tmp1->next=tmp1->next->next;

    // cout<<temp->sort<<" ";

    free(temp);

    temp=NULL;

    allc++;

    count=0;

    }

    else

    {

    tmp1=tmp1->next;

    }

    }

    cout<<endl;

    }

    //打印链表

    void Print(List p)

    {

    List tmp=p->next;

    cout<<p->sort<<" ";

    while(tmp!=p)

    {

    cout<<tmp->sort<<" ";

    tmp=tmp->next;

    }

    cout<<endl;

    }

    运行后效果为:

    输入环大小: 5

    输入地几个人出列: 6

    输入为:

    1 2 3 4 5

    出队顺序为:

    2 4 3 1 5

    Press any key to continue

  • 上一篇文章:

  • 下一篇文章:
  • 最新热点 最新推荐 相关文章
    用C语言实现的闹钟程序
    C#实现Windows关机的代码
    用动态规划法求组和数的算法
    循环结构程序具有哪3个组成部分?
    const成员函数有什么特点?
    c语言求平均分程序
    一道关于指针的C语言题
    C语言求3个整数的最大公约数
    BM模式匹配算法C语言实现
    从键盘输入任意5个4位整数存入数组a…
    关于45IT | About 45IT | 联系方式 | 版权声明 | 网站导航 |

    Copyright © 2003-2011 45IT. All Rights Reserved 浙ICP备09049068号