欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

单向循环链表简单应用

程序员文章站 2024-03-23 21:35:58
...

如题,给出n,s,m三个整数。n个人围成一圈,从第s个人开始从1数数,数到第m的人退出圈子,然后从下一个人又开始从1数数,数到第m的人退出。如此循环下去,输出这n个人退出的顺序。

解决的一种方法就是应用单项循环链表,进行模拟。代码如下:

#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstdio>

using namespace std;

#define pnode struct node*
#define cre_sp (pnode)malloc(sizeof(struct node))

struct node
{
    int info;
    pnode link;
};

void create(pnode &head,int n)
{
    pnode p;
    pnode q;

    p=head=cre_sp;

    p->info=1;
    p->link=p;

    for(int i=2;i<n+1;i++)
    {
        q=cre_sp;
        q->info=i;

        q->link=p->link;//头尾相连
        p->link=q;
        p=q;
    }
    free(p);
    free(q);
}

void delt(pnode &head,int s,int m)
{
    pnode pre=head;
    if(s!=1)
    {
        for(int i=2;i<s;i++)
        {
            pre=pre->link;
        }
    }

    while(pre!=pre->link)
    {
        for(int i=2;i<=m;i++)
        {
            pre=pre->link;
        }
        cout<<pre->link->info<<endl;
        pre->link=pre->link->link;//结点新建连接表示一个人退出
    }
    cout<<pre->info<<endl<<"done";
    free(pre);
}

int main()
{
    int n,s,m;
    pnode head;

    cin>>n>>s>>m;

    create(head,n);
    delt(head,s,m);

    return 0;
}