提前说说:
学校的教材非常不严谨,这本书还是改过了,最新版的,还是有一系列的问题。比如今天的约瑟夫环问题,输入人数和循环次数。我写完代码后,发现和书上的排序不同,看了我的代码好像没有太多问题,于是我自己拿手数了,发现书上的答案果然是错的。。。。。。。具体教材就不说是哪一本了,不是太推荐,最多给你的就是思路,课本上的代码还是取之有量就好,最主要的还是看你有无理解其真正的方法。
约瑟夫环问题:
#include "stdio.h"
#include "stdlib.h"
struct student
{
int num;
int password;
struct student *next;
};
struct student *CreateList();
void JosephusOperate(struct student *L,int m);
int main()
{
int m;
struct student *L;
L=CreateList();
scanf("%d",&m);
JosephusOperate(L,m);
return 0;
}
struct student *CreateList()
{
int n,i;
struct student *L,*pNew,*pCur=NULL;
scanf("%d",&n);
L=(struct student *)malloc(sizeof(struct student));
pNew=(struct student *)malloc(sizeof(struct student));
scanf("%d",&pNew->password);
pNew->num=1;
L=pNew;
for(i=1;i<n;i++)
{
pCur=pNew;
pNew=(struct student *)malloc(sizeof(struct student));
scanf("%d",&pNew->password);
pNew->num=i+1;
pCur->next=pNew;
pCur=pNew;
}
pCur->next=L;
return L;
}
void JosephusOperate(struct student *L,int m)
{
int i;
struct student *pHead,*pMid,*pMid1,*pCur=NULL;
pHead=L;
pMid=L;
while(pHead!=pCur)
{
for(i=1;i<19;i++)
{
pMid=pMid->next;
pMid1=pMid->next;
}
printf("第%d个人出列,其密码为%d\n",pMid1->num,pMid1->password);
pCur=pMid1->next;
pMid->next=pMid1->next;
pMid=pCur;
free(pMid1);
}
}