回 帖 发 新 帖 刷新版面

主题:求助!一个惹闹了我的题目(用C语言实现)源代码

任务:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。
要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。
测试数据:    
m的初值为20,n=7 ,7个人的密码依次为3,1,7,2,4,7,4,首先m=6,则正确的输出是什么?
要求:
输入数据:建立输入处理输入数据,输入m的初值,n ,输入每个人的密码,建立单循环链表。
输出形式:建立一个输出函数,将正确的输出序列

回复列表 (共8个回复)

沙发

等我学完链表的 再给你解

板凳

TJU1012

3 楼

这道题可以把这7个人看成一个大圆环,7个人的编号从1-7,他们的密码就是按照3,1,7,2,4,7,4来赋值,我们从第1个开始,首先你输入m(这要有个判断,如果m=这7个人的密码中的一个就接着往下执行,否则就提示以下不对,接着输入m),如果输入的m=3,那么就会发现第1个人的密码为3,就是说第3个人要出去,则第3个人被删除掉,他的密码为1,那么m=1,所以第4个人也出去,就是这么找下去,最后的输出结果为3 4 6 2 5 1 7
至于建立的单链表吗~里面包含他们的编号,密码,还有一个指向下一个位置的指针就可以了!

4 楼

很简单啊,我现在有事,一会写上来

5 楼

#include<iomanip.h>
#include<stdlib.h>
//==============================================类对象声明==========================//
template <class T> class list;
template <class T>
class node
{
    friend class list<T> ;
    friend class circlelist;
    private:
        T data;
        node<T>  * next;
};
//----------
template <class T>
class list
{
    friend class circlelist;
    public:
        list(){first=NULL;}
        bool insert(int a,T b);
        int length();
    private:
        node<T> * first;
};
//----------
class circlelist
{
    public:
        circlelist(list<int>& l,int& num)                 //初始化循环链表,让1->2->3....num->1
        {
            for(int i=1;i<=num;i++)
            {
                l.insert(i-1,i);
            }
            node<int> * p=l.first;
            for(int j=1;j<num;j++)
                p=p->next;
            p->next=l.first;
        }
        void change(list<int>& l,int *& q,int & shi,int & num)           //报到call的分别删除.并存到数组q
        {
            cout<<"输入报数号:";
            int call;
            cin>>call;
            if(call<1)
            exit(1);
            if(call==1)
            {
                for(int h=1;h<=num;h++)
                    q[h-1]=h;
                return;
            }
            node<int> *p=l.first;
            int k;
            int n=0;
            while(true)
            {
                for(k=1;k<call-1;k++)
                    p=p->next;
                    node<int> * t;
                    t=p->next;
                    p->next=t->next;
                    q[n]=t->data;
                    delete t;
                    n++;
                    p=p->next;
                    shi++;
                    if(shi>=num)
                       break;
            }
        }
};        
//==========================================类函数定义=================================//
template<class T>
bool list<T>::insert(int a,T input)
{
    node<T> * p=first;
    node<T> * q=new node<T>;
    q->data=input;
    int t=length();
    if(a<0 ||a>t)
        return 0;
    if(a==0)
    {
        q->next=first;
        first=q;
    }
    else
    {
        for(int i=1;i<a;i++)
            p=p->next;
        q->next=p->next;
        p->next=q;
    }
    return 1;
}
//----------
template<class T>
int list<T>::length()
{
    node<T>* p=first;
    for(int i=0;p;i++)
        p=p->next;
    return i;
}
//************************************主程序********************************************************//
void main()
{
    int num;
    int shi=0;
    cout<<"输入游戏人数:";
    cin>>num;
    list<int> l;
    circlelist s(l,num);
    int * q=new int [num];
    s.change(l,q,shi,num);
    for(int m=1;m<=num;m++)
        cout<<q[m-1]<<" ";
    cout<<endl;
    char h;
    cin>>h;
}




6 楼

跟你那个不是完全相同,我会尽快写个完全相同的

7 楼

完全正确的:
#include<iomanip.h>
#include<stdlib.h>
//==============================================类对象声明==========================//
template <class T> class list;
template <class T>
class node
{
    friend class list<T> ;
    friend class circlelist;
    private:
        T data;
        T no;
        node<T>  * next;
};
//----------
template <class T>
class list
{
    friend class circlelist;
    public:
        list(){first=NULL;}
        bool insert(int a,T b,T no);
        int length();
    private:
        node<T> * first;
};
//----------
class circlelist
{
    public:
        circlelist(list<int>& l,int& num,node<int>*& last)                 //初始化循环链表,让1->2->3....num->1
        {
            int code;
            for(int i=1;i<=num;i++)
            {
                cout<<"输入第"<<i<<"人手中的密码:";
                cin>>code;
                l.insert(i-1,code,i);
            }
            node<int> * p=l.first;
            for(int j=1;j<num;j++)
                p=p->next;
            last=p;
            p->next=l.first;
        }
    void change(list<int>& l,int *& q,int & shi,int & num,node<int>*&last)           //报到call的分别删除.并存到数组q
        {
            cout<<"输入报数号(报到此数的人将退出游戏):";
            int call;
            cin>>call;
            if(call<1)
            exit(1);
            int k;
            int n=0;
            if(call==1)                    //初始报数为1的情况
            {
                node<int> * t;
                t=last->next;
                last->next=t->next;
                call=t->data;
                q[n]=t->no;
                delete t;
                n++;
                shi++;
                while(true)
                {
            
                for(k=1;k<call;k++)
                    last=last->next;
                    node<int> * t;
                    t=last->next;
                    last->next=t->next;
                    call=t->data;
                    q[n]=t->no;
                    delete t;
                    n++;
                    shi++;
                    if(shi>=num)
                       break;
                }
                return;
            }
            node<int> *p=l.first;                //初始报数不为1的情况
            for(k=1;k<call-1;k++)
                p=p->next;
            node<int> * t;
            t=p->next;
            p->next=t->next;
            call=t->data;
            q[n]=t->no;
            delete t;
            n++;
            shi++;
            while(true)
            {
                for(k=1;k<call;k++)
                    p=p->next;
                    node<int> * t;
                    t=p->next;
                    p->next=t->next;
                    call=t->data;
                    q[n]=t->no;
                    delete t;
                    n++;
                    shi++;
                    if(shi>=num)
                       break;
            }
        }
};        
//==========================================类函数定义=================================//
template<class T>
bool list<T>::insert(int a,T input,T no)
{
    node<T> * p=first;
    node<T> * q=new node<T>;
    q->data=input;
    q->no=no;
    int t=length();
    if(a<0 ||a>t)
        return 0;
    if(a==0)
    {
        q->next=first;
        first=q;
    }
    else
    {
        for(int i=1;i<a;i++)
            p=p->next;
        q->next=p->next;
        p->next=q;
    }
    return 1;
}
//----------
template<class T>
int list<T>::length()
{
    node<T>* p=first;
    for(int i=0;p;i++)
        p=p->next;
    return i;
}
//************************************主程序********************************************************//
void main()
{
    int num;
    int shi=0;
    node<int>* last;
    cout<<"输入游戏人数:";
    cin>>num;
    list<int> l;
    circlelist s(l,num,last);
    int * q=new int [num];
    s.change(l,q,shi,num,last);
    cout<<"游戏者退出游戏的序列是:";
    for(int m=1;m<=num;m++)
        cout<<q[m-1]<<" ";
    cout<<endl;
    char h;
    cin>>h;
}




8 楼


二叉树所含的几个结点和满二叉树中编号为1至n结点一一对应,

我来回复

您尚未登录,请登录后再回复。点此登录或注册