数据结构约瑟夫环实习报告源码

#include<cstdio>
int n,m;
struct LinkList
{
    int bianhao;
    int mima;
    struct LinkList* next;
}LinkHuan[50];
void duru()
{
    printf("请按编号顺序输入密码值:\n");

    for(int i=1;i<=n;i++){
        scanf("%d",&LinkHuan[i].mima);
        LinkHuan[i].bianhao=i;
        if(i==n) LinkHuan[i].next=&LinkHuan[1];
        else LinkHuan[i].next=&LinkHuan[i+1];
    }
}
void shuchu()
{

    printf("正确的出列顺序为:\n");
     LinkList* p=&LinkHuan[1];
    while(p->next!=p){
        for(int i=1;i<m-1;i++)
            p=p->next;
        printf("%d出列\n",p->next->bianhao);
        m=p->next->mima;
        p->next=p->next->next;
        if(m!=1)
        p=p->next;
    }
    printf("%d出列\n",p->bianhao);
}
int main()
{
    printf("请输入人的个数n和m的初始值:\n");
    scanf("%d%d",&n,&m);

    duru();

    shuchu();

    return 0;
}
/*
7 20
3 1 7 2 4 8 4
*/

这种是先循环m-2次,在看m的值循环第m-1次。

一定要注意m为1的情况。

#include<iostream>
#include<malloc.h>
using namespace std;

struct LinkList
{
   int data; //代表编号结点的数据
   int password;//代表密码结点的数据
   LinkList *next;//代表后一个结点的地址
};
int m,n,i,j;
LinkList *p,*q,*first;
void Printf()
{
    cout<<"请输入m的初始值 m:";
    cin>>m;
    cout<<"请输入人数 n:";
    cin>>n;
}
int ShuruMima()
{
    for(i=1;i<=n;i++)
   {
        if(i==1)
        {
            first=p=(LinkList*)malloc(sizeof(LinkList));
            if(p==0)
                return 0;
        }
        else
        {
            q=(LinkList*)malloc(sizeof(LinkList));
            if(q==0)
                return 0;
            p->next=q;
            p=q;
        }
        cout<<"请输入第 "<<i<<" 个人的密码: ";
        cin>>(p->password);
        p->data=i;
   }
}
void ShuChu()
{
    p->next=first; //让表尾指向表头形成循环链表
   p=first;
   cout<<"出列顺序为: ";
   for (j=1;j<=n;j++)
   {
        for(i=1;i<m;i++,p=p->next);
        m=p->password;
        cout<<p->data<<" ";
        p->data=p->next->data;
        p->password=p->next->password;
        q=p->next;
        p->next=p->next->next;
        free(q);
   }
   cout<<endl;
}
int main()
{
   Printf();

    ShuruMima();

    ShuChu();


   return 0;
}

这个是循环m-1次后,直接把下个节点移上来,相对简单。

写个报个弄了半天,感觉浪费了不少时间,还弄的费劲。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值