使用循环链表解决出圈问题:
#include<stdio.h>
typedef struct cycleLink
{
int data;
struct cycleLink *next;
}cNode;
//建立循环链表
cNode* createCycleLink(int n)
{
cNode *current,*p;
int i;
if(n<1) return NULL;
current = (cNode*)malloc(sizeof(cNode));
current ->data =1;
current ->next = current;
for(i=2;i<=n;i++)
{
p = (cNode*)malloc(sizeof(cNode));
p -> data = i;
p -> next = current->next;
current -> next = p;
current = p;
}
current = current->next;
return current;
}
//得到最后剩下的数
int getLastOut(cNode *current,int step)
{
int i;
cNode *pre;
printf("\nthe out order is: \n");
while(current -> next != current)
{
for(i=1;i<step;i++)
{
pre = current;
current = current -> next;
}
printf("%d ",current->data);
pre -> next = current ->next;
free(current);
current = pre ->next;
}
return current->data;
}
//打印循环链表
void printCycleLink(cNode *current)
{
cNode *start,*p;
start = current;
p = current;
if(p != NULL)
{
printf("%d ",p->data);
p = p->next;
}
while(p != start)
{
printf("%d ",p->data);
p = p->next;
}
}
void main()
{
cNode *current;
int lastOne;
current = createCycleLink(6); //总人数
printCycleLink(current);
lastOne = getLastOut(current,4); //每4个人出圈
printf("\nthe last one is:\n %d \n", lastOne);
}
不使用循环链表解决出圈问题:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,k,m,n,num[50],j;
int* p=num;
printf("input number of person:n=");
scanf("%d",&n);
printf("input number of the quit:m=");
scanf("%d",&m);
for(i=0;i<n;i++)
{
*(p+i)=i+1;
}
i=0;
k=0;
j=0;
while(j<n-1)
{
if(*(p+i)!=0) //若p指向的数字还未被删除,还有效,计数k++
{
k++;
}
if(k==m)//将踢出的数值设置为0
{
printf("delete value=%d\n",*(p+i));
*(p+i)=0; //退出,对应的数组元素置为0
k=0;
j++;
}
i++;
if(i==n)//一次数组遍历完,从头开始再次遍历;
{
i=0;
}
}
while(*p==0)
{
p++;
}
printf("The last one is NO.%d\n",*p);
}