//这是按题目要求来的单链式实现代码
#include
#include
typedef struct Node
{
int seq;
struct Node* _next;
}Node;
Node* CreateNodeTable(int n)
{
Node* first = NULL;
Node* last = NULL;
Node* p = NULL;
for(int i=0;i
p=(Node*)malloc(sizeof(Node));
if(!p) return NULL;
p->seq = i+1;//序号从1开始
p->_next = NULL;
if(!first)
{
first=p;
last=p;
}
else
{
last->_next=p;
last=p;
}
}
last->_next=first;
return first;
}
Node* GetStartNode(Node* pFirst, int s)
{
Node *cur = pFirst;
Node *pre = NULL;
if(!pFirst) return NULL;
if(cur->_next==cur)
{
return cur;
}
while (--s)
{
pre=cur;
cur=cur->_next;
}
return cur;
}
Node* JosephCircle(Node* pStart, int m)
{
Node *cur = pStart;
Node *pre = NULL;
if(!pStart) return NULL;
if(cur->_next==cur)
{
cur->_next=NULL;
return cur;
}
while (--m)
{
pre=cur;
cur=cur->_next;
}
pre->_next = cur->_next;
return cur;
}
void main()
{
Node *pFirst,*pStart,*pRet;
int n,s,m;
printf("input n:");
scanf("%d",&n);
printf("input s:");
scanf("%d",&s);
printf("input m:");
scanf("%d",&m);
if(n>1000||s==0||m==0)
{
printf("input error\n");
return;
}
pFirst=CreateNodeTable(n);//建表
pStart=GetStartNode(pFirst,s);//获取开始节点
//约瑟夫环取m对应节点,显示并释放获取到的节点
while(pStart)
{
pRet=JosephCircle(pStart,m);
printf("%d ",pRet->seq);
pStart=pRet->_next;
free(pRet);
}
}
/////////////////////////////////////////////////////////////
//顺序式代码
#include
#include
#define maxsize 1000
int table[maxsize];
void CreateNodeTable(int n)
{
for(int i=0;i
table[i]=i+1;//序号从1开始
}
}
void main()
{
int n,s,m;
printf("input n:");
scanf("%d",&n);
printf("input s:");
scanf("%d",&s);
printf("input m:");
scanf("%d",&m);
if(n>maxsize||s==0||m==0)
{
printf("input error\n");
return;
}
CreateNodeTable(n);//建表
s--;
while(n)
{
s=(s+m-1)%n;
printf("%d ",table[s]);
for(int i=s;i
table[i]=table[i+1];
}
n--;
}
}
既然都尝试一晚上了,不妨把遇到的困难点提出来,让别人帮你解惑,这样学来才有收获