回 帖 发 新 帖 刷新版面

主题:[原创]约瑟夫环-我的第一个数据结构实验(好激动啊~)

#include <iostream>
using namespace std;

typedef struct LNode
{
    int num,pwd;
    struct LNode *next;
}LNode,*LinkList;

int main()
{    
    int i,j,m,n;                            //m为报数上限,n为人数。
    cout<<"Please enter n=";
    if(!(cin>>n)) {cout<<"ERROR:That's not a number!";return -1;}
    cout<<"Please enter m=";
    if(!(cin>>m)) {cout<<"ERROR:That's not a number!";return -2;}
    LinkList head,tail,p,q;                 //head为头结点指针,tail为尾结点
                      //指针,p为当前指针的前一指针,q
                                            //当前指针。
    head=new LNode;
    p=head;
    for(i=1;i<n;i++)
    {
        q=new LNode;
        p->next=q;
        p=q;
    }
    tail=q;
    tail->next=head;                        //建立n个结点的循环链表。

    p=head;
    for(i=1;i<=n;i++)
    {
        p->num=i;
        cout<<"Please enter No."<<i<<"'s password:";
        cin>>p->pwd;
        p=p->next;
    }                                       //输入密码。

    cout<<"result:";
    p=tail;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<m;j++) p=p->next;
        q=p->next;
        m=q->pwd;
        cout<<" "<<q->num;
        p->next=q->next;
        delete q;
    }                                       //输出编号。
    return 0;
}

回复列表 (共20个回复)

沙发

老兄好厉害!佩服!

板凳

呵呵加油加油,继续努力啊[em2]

3 楼

再完善一下,加上M和N的输入判断

4 楼

楼主继续,把程序完成

5 楼

请教怎么编写m、n的输入判断?

6 楼

如果用cin的话 都输进去了 要怎么判断呢?

7 楼

难道先getchar() 得到的值判断一下再赋给m、n? 要如何实现?

8 楼

/*
version 1.0
coder    dvdface
date    2005.11.14

sqlist
*/
#include <iostream.h>



#define n0 100

#define datatype int


struct sqlist{
    datatype v[n0+1];
    int n;
};

int init(sqlist &L)
{
    L.n = 0;

    return 0;
}

int ins(sqlist &L,
         int i,
         datatype x)
{


    if((i>n0)||(i<1)||(L.n>=n0)||(i>L.n+1))
        return -1;

    for(int j=L.n;j>=i;j--)
        L.v[j+1] = L.v[j];

    L.v[i]=x;

    L.n++;

        return 0;
}

int del(sqlist &L,int i)
{
    if(i<1 || i>L.n)
        return -1;

    for(int j=i;j<L.n;j++)
        L.v[j] = L.v[j+1];
    L.n--;

    return 0;
}

int prt(sqlist L)
{
    if(L.n<1)
        return -1;

    for(int i=1;i<=L.n;i++)
        cout<<L.v[i]<<" ";

    cout<<endl;

    return 0;
}

int joseph(sqlist &L,int m)
{
    if(m<0)
        return -1;
    
    cout<<"Joseph : ";

    for(int i=1;L.n!=0;)
    {
        i = (i+m-1) % L.n;

        if(i==0)
            i=L.n;

        cout<<L.v[i]<<" ";
        del(L,i);

    }

    cout<<endl;

    return 0;

}


int main()
{
    sqlist list;

    init(list);

    ins(list,1,1);
    ins(list,2,2);
    ins(list,3,3);
    ins(list,4,4);
    ins(list,5,5);
    ins(list,6,6);
    ins(list,7,7);
    ins(list,8,8);

    prt(list);

    joseph(list,4);
    
    return 0;
}

9 楼

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
typedef struct
{
             int *elem;
             int length;
             int listsize;
}SList;
SList L;
int n;                                  
//--------------------------------void Joseph(int m)-----------------------//
void Joseph(int m)  {
    int p,k,t;
    p=0;                                      //记录零元个数
    k=0;           
    t=0;                                      //记录被删除元素的下一个元素
    while(p<n){                               //当所有元素为零时退出
        while(k<m){
            if(L.elem[t])k++;
            t=(t+1)%n;
        }
        m=L.elem[(t+n-1)%n];
        L.elem[(t+n-1)%n]=0;                   //将挑出的元素赋为零
        k=0;
        printf("%d\t",(t+n-1)%n+1);
        p++;
    }
}//------------------------------------------------------------------------//
void main()
{
     int i,m;
     printf("输入线性表长度: n=");
     scanf("%d",&n);
     if(n>LIST_INIT_SIZE)
     {
       printf("OVERFLOW!!");
       exit(0);
     }
       L.elem=malloc(LIST_INIT_SIZE*sizeof(int));         
       if(!L.elem)
          {
           printf("malloc fail!");
           exit(0);
       }
          L.length=n;
          L.listsize=LIST_INIT_SIZE;
          printf("输入 %d 个数:\n",n);
          for(i=0;i<L.length;i++)
              scanf("%d",&L.elem[i]);
          printf("\n输入第一个报数号码:m=");
          scanf("%d",&m);
          printf("\n出队顺序为:\n");
          Joseph(m);
}


10 楼

不知这个程序怎么样

我来回复

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