回 帖 发 新 帖 刷新版面

主题:谁能帮忙看下,一个简单题目.不胜感激

我刚开数据结构.
这个是那个JOESPH问题
n个人,从s个人开始,没m个人删去.
要你输出次序.
以下是我写的.请大家帮我看下,我会给分,不会让你们白看的.
再次感谢.

#include<iostream>
using namespace std;

class ChainNode
{
    friend class Chain;
private:    
    int data;
    ChainNode *link;
};

class Chain
{
public:
    void fn(int n,int s,int m);
private:
    ChainNode *first;
};

void Chain::fn(int n,int s,int m)
{
    if(n<=0||s<=0||m<=0)    return;//如果不符合条件(EG,n=-10)
    first = new ChainNode;
    ChainNode *p,*q;
    first->data=1;
    first->link=first;//设置第一个结点,又因为它是循环链表
    p=first;//活动指针
    for(int i=2;i<n+1;i++)
    {//构建n个结点的链表,且给每个结点赋值
        ChainNode *s=new ChainNode;
        s->data=i;
        p->link=s;
        s->link=p->link;
        p=s;
    }
    p=first;
    for(int j=1;j<s;j++)//找第s个位置,p指向s
        p=p->link;
    while(n-1)
    {
        for(int k=1;k<m-1;k++)
            p=p->link;//找到第s+m-1,即该删的前一项
        
        q=p->link;
        p->link=q->link;
        p=q->link;//下把从删的结点后面继续查
        cout<<q->data<<endl;
        delete q;
        n--;
    }
}

void main()
{
    Chain a;
    a.fn(10,2,3);
}

这里我就简单写了下,也没弄其他函数
zaiciganxie

回复列表 (共4个回复)

沙发


恩 可以实现~ 你再仔细看看 还可以优化下

板凳

[quote]
恩 可以实现~ 你再仔细看看 还可以优化下[/quote]


谢谢
...

可是我的VC,怎么运行时出现错误呢....

3 楼

可以运行的啊.
楼主...
结果
4
7
10

4 楼

这是我写的。运行过了。比较一下。大家互进。
#include <iostream.h>
 struct List
{
    int date;
    struct List *next;
};
void InitList(struct List **head)
{
    *head=NULL;
}
void fndList(struct List **head,int max)
{
    int i;
    *head=new List;
    struct List *point1,*point2;
    point1=*head;
    point1->date=1;
    point1->next=NULL;
    for(i=1;i<max;i++)
    {
        point2=new List;
        point1->next=point2;
        point1=point1->next;
        point1->date=i+1;
    }
    point1->next=*head;
    
}
void TraverseList(struct List *head,int Max)
{
    int i;
    for(i=1;i<Max;i++)
    {
        cout<<head->date<<" ";
        head=head->next;
    }
    cout<<head->date<<endl;
}
void OutList(struct List **head,int a,int b)
{
    struct List *point,*flag;
    int i;
    point=*head;
    for(i=1;i<b;i++)
        point=point->next;
    while(point!=point->next)
    {
        for(i=1;i<a;i++)
        point=point->next;
        flag=point->next;
        cout<<endl;
        cout<<flag->date<<"号猴子被淘汰"<<endl;
        
        point->next=flag->next;
        //delete point;
        flag=flag->next;
    }
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<"恭喜"<<flag->date<<"号猴子是大王"<<endl;
    delete flag;

}
void main()
{
    int m,n,p;
    struct List *top;
    cout<<"请输入猴子的数量m:"<<endl;
    cin>>m;
    cout<<"你想从第几只猴子开始报数"<<endl;
    cin>>p;
    cout<<"你想报数为第几的猴子出列"<<endl;
    cin>>n;
    InitList(&top);
    fndList(&top,m);
    TraverseList(top,m);
    OutList(&top,n,p);
}





我来回复

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