第四周 项目4 猴子选大王

目标:一群猴子,编号是1,2,3,,,,m,这群猴子按照1-m排序做一圈。从第一只开始数,没到第n个,该猴子离开圈子,到最后,剩下一个猴子就是猴王。

代码:

#include <iostream>
#include "kudetouwenjian.h"
using namespace std;
int main()
{
     linknode *L;
     A e=0;
     int m,n,c;
     cin>>m>>n;
     A a[m];
     A b[m];
     for(int i=0;i<m;i++)
          a[i]=i+1;
     xunhuanlianbiao(L,a,m);
     if(n==1)
     {
          cout<<m<<endl;
          return 0;
     }
     houzi(L,n,m);
     return 0;
}
#include <iostream>
#include <malloc.h>
#include "kudetouwenjian.h"
using namespace std;
void houzi(linknode *&L,int n,int m)
{
     linknode *p=L->next;
     for(int i=0;i<m-1;i++)
     {
          for(int a=0;a<n-1;a++)
          {
               L=p;
               p=L->next;
          }
          L->next=p->next;
          free(p);
          p=L->next;
     }
     cout<<L->shuju<<endl;
}
void xunhuanlianbiao(linknode *&L,A a[],int n)
{
         linknode *s,*r;
     L=(linknode *)malloc(sizeof(linknode));
     r=L;
     for(int i=0;i<n;i++)
     {
          s=(linknode *)malloc(sizeof(linknode));
          s->shuju=a[i];
          r->next=s;
          r=s;
     }
     r->next=L->next;
}
void toucha(linknode *&L,A a[],int n)
{
     linknode *s;
     L=(linknode *)malloc(sizeof(linknode));
     L->next=NULL;
     for(int i=0;i<n;i++)
     {
          s=(linknode *)malloc(sizeof(linknode));
          s->shuju=a[i];
          s->next=L->next;
          L->next=s;
     }
}
void shuchu(linknode *L)
{
     linknode *p=L->next;
     while(p!=NULL)
     {
          cout<<p->shuju<<" ";
          p=p->next;
     }
     cout<<endl;
}
void weicha(linknode *&L,A a[],int n)
{
     linknode *s,*r;
     L=(linknode *)malloc(sizeof(linknode));
     r=L;
     for(int i=0;i<n;i++)
     {
          s=(linknode *)malloc(sizeof(linknode));
          s->shuju=a[i];
          r->next=s;
          r=s;
     }
     r->next=NULL;
}
void chushihua(linknode *&L)
{
     L=(linknode *)malloc(sizeof(linknode));
     L->next=NULL;
}
void cuihui(linknode *&L)
{
     linknode * pre=L,* p=L->next;
     while(p!=NULL)
     {
          free(pre);
          pre=p;
          p=pre->next;
     }
     free(pre);
     L->next=NULL;
}
int panduanshifouweikong(linknode *L)
{
     return(L->next==NULL);
}
int changdu(linknode *L)
{
     int e=0;
     linknode *p=L->next;
     while(p!=NULL)
     {
          e++;
          p=p->next;
     }
     return(e);
}
int shunxuchazhao(linknode * L,int i,A &e)
{
     int j=1;
     linknode *p=L->next;
     if(i<=0)j=j;;
     while(j<i)
     {
          j++;
          p=p->next;
     }
     if(p==NULL)
          j=j;
     else
     {
          e=p->shuju;
          return(e);
     }
}
int chazhaodange(linknode *L,A e)
{
     int j=1;
     linknode *p=L->next;
     if(p==NULL)
          return 0;
     while(p!=NULL&&e!=p->shuju)
     {
          p=p->next;
          j++;
     }
     if(p==NULL)
          return 0;
     else
     return(1);
}
bool charudange(linknode *&L,int i,A e)
{
     int j=0;
     linknode * p=L,* s;
     if(i<=0)return false;
     while(j<i-1&&p!=NULL)
     {
          j++;
          p=p->next;
     }
     if(p==NULL)
          return false;
     else
     {
          s=(linknode *)malloc(sizeof(linknode));
          s->shuju=e;
          s->next=p->next;
          p->next=s;
     }
}
#ifndef KUDETOUWENJIAN_H_INCLUDED
#define KUDETOUWENJIAN_H_INCLUDED
#include <iostream>
typedef int A;
typedef struct lianbiao
{
     A shuju;
     struct lianbiao *next;
}linknode;
void toucha(linknode *&L,A a[],int n);
void shuchu(linknode *L);
void weicha(linknode *&L,A a[],int n);
void chushihua(linknode *&L);
void cuihui(linknode *&L);
int panduanshifouweikong(linknode *L);
int changdu(linknode *L);
int shunxuchazhao(linknode *L,int i,A &e);
int chazhaodange(linknode *L,A e);
bool charudange(linknode *&L,int i,A e);
void xunhuanlianbiao(linknode *&L,A a[],int n);
void houzi(linknode *&L,int n,int m);
#endif // KUDETOUWENJIAN_H_INCLUDED
运行图:
心得:
这次算是一次循环链表的应用题。我把它想的太难了,用链表的删除就行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值