回 帖 发 新 帖 刷新版面

主题:数据结构课程设计 Joseph环 那位大哥大姐帮帮忙

题目:Joseph环
任务:编号是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 ,输入每个人的密码,建立单循环链表。
输出形式:建立一个输出函数,将正确的输出序列

[color=00FF00][/color][em18]

我的邮箱:tczll@hotmail.com

回复列表 (共6个回复)

沙发

这个我有
联系我 chinaren2k@gmail.com
出售

板凳

#include<iostream.h>
#include<stdlib.h>

typedef struct LNode
{
    int listnumber,password;
    struct LNode *next;
}LNode,*Linklist;

void create(Linklist &l,int n)
{
    int i=1;
    l=(Linklist)new(LNode);
    cout<<"请输入第 "<<i<<" 个人的密码:"<<endl;
    cin>>l->password;
    l->listnumber = i;
    Linklist p,q=l;
    for(i=2;i<=n;i++)
        {
        p=(Linklist)new(LNode);
        cout<<"请输入第 "<<i<<" 个人的密码:"<<endl;
        cin>>p->password;
        p->listnumber=i;
        q->next=p;
        q=p;
        if(i==n)
            {
            q->next=l;
            }
        }
}

void game(Linklist &l,int m,int n)
{
    Linklist p=l,k;
    int i;
    while(n)
        {
        for(i=1;i<m-1;i++)
            p=p->next;
        k=p->next;
        cout<<k->listnumber<<" ";
        m=k->password;
        p->next=k->next;
        p=p->next;
        n--;
        free(k);
        }
    cout<<endl;
}

int main()
{
    Linklist L;
    int m,n;
    char c;
loof:    cout<<"请输入初次报数值以及人数:"<<endl;
    cin>>m>>n;
    create(L,n);
    game(L,m,n);
    cout<<"continue?"<<endl;
    cin.get();
    cin.get(c);
    if(c=='y')
        goto loof;
    free(L);
    return 0;
}



这是开学时候编的,印象中没有错误,GOTO语句是为了方便测试临时加的,大家自己把它删掉,并且套入循环,强烈建议不要用GOTO语句,当然调试除外.方便起见用了C++的输入输出,改成C很容易,这是完全的过程化,不是面向对象

3 楼

要是密码是一个数的话怎么改?卖身求助!!!!

4 楼

#include<iostream.h>
#include<stdlib.h>

typedef struct LNode
{
    int listnumber,password;
    struct LNode *next;
}LNode,*Linklist;

void create(Linklist &l,int n)
{
    int i=1;
    l=(Linklist)new(LNode);
    cout<<"请输入第 "<<i<<" 个人的密码:"<<endl;
    cin>>l->password;
    l->listnumber = i;
    Linklist p,q=l;
    for(i=2;i<=n;i++)
        {
        p=(Linklist)new(LNode);
        cout<<"请输入第 "<<i<<" 个人的密码:"<<endl;
        cin>>p->password;
        p->listnumber=i;
        q->next=p;
        q=p;
        if(i==n)
            {
            q->next=l;
            }
        }
}

void game(Linklist &l,int m,int n)
{
    Linklist p=l,k;
    int i;
    while(n)
        {
        for(i=1;i<m-1;i++)
            p=p->next;
        k=p->next;
        cout<<k->listnumber<<" ";
        m=k->password;
        p->next=k->next;
        p=p->next;
        n--;
        free(k);
        }
    cout<<endl;
}

int main()
{
    Linklist L;
    int m,n;
    char c;
loof:    cout<<"请输入初次报数值以及人数:"<<endl;
    cin>>m>>n;
    create(L,n);
    game(L,m,n);
    cout<<"continue?"<<endl;
    cin.get();
    cin.get(c);
    if(c=='y')
        goto loof;
    free(L);
    return 0;
}
呵呵,窃取你的劳动成果一用。
小注:以后编程最好不要用qoto!!

5 楼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
    int m, n, step=0, index=0, cir=0, t;
    scanf("%d%d", &m, &n);
    char *out = (char*)malloc(m);
    if(!out)  return -1;
    memset(out, 0, m);
    while(1)
    {
        if(step==m)  break;
        while(cir<n)
        {
            if(!out[index]) ++cir;
            index=(index+1)%m;          
        }     
        cir=0; ++step; out[(index+m-1)%m]=1;
        printf("\nNo.%d out.", !index?m:index);
    }    
    free(out);
    system("PAUSE");    
    return 0;
}

6 楼

这个题我们还有一个实现提示:采用单向循环链表存储,报数到M的结点删除,继续从下一结点开始.

我来回复

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