第四周项目4猴子选大王

来源:互联网 发布:淘宝上好看的卫衣店 编辑:程序博客网 时间:2024/06/05 10:52
  1. /* 
  2. *Copyright(c)2017,烟台大学计算机学院 
  3. *All right reserved. 
  4. *文件名:main.cpp list.h list.cpp 
  5. *作者:盛凯 
  6. *完成日期:2017年9月28日 
  7. *版本号:v1.0 
  8. * 
  9. *问题描述:猴子选大王
  10. *输入描述:猴子个数,数几 
  11. *程序输出:哪个猴子是大王 

  1. */  

  2. #include <stdio.h>  
    #include<iostream>
    #include <malloc.h>  
    #include "list.h"  
    using namespace std;
      
      
    int main()  
    {  
        LinkList *L1;  
    int m,n,i,j;
       
    cout<<"请输入猴子数量和被离开的序号"<<endl;
    cin>>m>>n;
    ElemType a[100];


    for(i=1;i<=m;i++)
    {
           a[i-1]=i;
    }
         CreateListR(L1, a, m);

    LinkList *p=L1->next;
    while(L1->next!=NULL)
    L1=L1->next;
    L1->next=p;
    L1=L1->next;


       if(n==1)
        cout<<m<<endl;
       else
       {


    for(j=0;j<m-1;j++)
    {
    for(i=1;i<n-1;i++)
    {
                  L1=L1->next;
    }
    L1->next=L1->next->next;
    L1=L1->next;


    }
    L1->next=NULL;
        cout<<L1->data<<endl;
       }
        return 0;  
    }
list.cpp:

#include "stdio.h"  
#include <malloc.h>  
#include "list.h"  
  
void CreateListF(LinkList *&L,ElemType a[],int n)//头插法建立单链表  
{  
    LinkList *s;  
    int i;  
    L=(LinkList *)malloc(sizeof(LinkList));     //创建头结点  
    L->next=NULL;  
    for (i=0; i<n; i++)  
    {  
        s=(LinkList *)malloc(sizeof(LinkList));//创建新结点  
        s->data=a[i];  
        s->next=L->next;            //将*s插在原开始结点之前,头结点之后  
        L->next=s;  
    }  
}  
 void CreateListR(LinkList *&L,ElemType a[],int n)//尾插法建立单链表  
{  
    LinkList *s,*r;  
    int i;  
    L=(LinkList *)malloc(sizeof(LinkList));     //创建头结点  
    L->next=NULL;  
    r=L;                    //r始终指向终端结点,开始时指向头结点  
    for (i=0; i<n; i++)  
    {  
        s=(LinkList *)malloc(sizeof(LinkList));//创建新结点  
        s->data=a[i];  
        r->next=s;          //将*s插入*r之后  
        r=s;  
    }  
    r->next=NULL;           //终端结点next域置为NULL  
}  
  
void DestroyList(LinkList *&L)  //销毁单链表  
{  
    LinkList *p=L,*q=p->next;  
    while (q!=NULL)  
    {  
        free(p);  
        p=q;  
        q=p->next;  
    }  
    free(p);    //此时q为NULL,p指向尾结点,释放它  
}  
  
void DispList(LinkList *L)  //输出单链表  
{  
    LinkList *p=L->next;  
    while (p!=NULL)  
    {  
        printf("%d ",p->data);  
        p=p->next;  
    }  
    printf("\n");  
}  

list.h:

#ifndef LIST_H_INCLUDED  
#define LIST_H_INCLUDED  
typedef int ElemType;  
typedef struct LNode        //定义单链表结点类型  
{  
    ElemType data;  
    struct LNode *next;     //指向后继结点  
} LinkList;  
  
void CreateListF(LinkList *&L,ElemType a[],int n);//头插法建立单链表  
void CreateListR(LinkList *&L,ElemType a[],int n);//尾插法建立单链表  
void DestroyList(LinkList *&L); //销毁单链表  
void DispList(LinkList *L); //输出单链表  
  
  
#endif // LIST_H_INC


程序运行如图:






总结:本例用了很经典的约瑟夫问题的思想,上学期用C++做过,这学期用了链表后感觉比以前的做法简单,体会到了不同解决问题的思路

原创粉丝点击