Joseph问题题目描述:原始的Joseph问题的描述如下:有n个人围坐在一个圆桌周围,把这n个人依次编号为1,…,n。从编号是start的人开始报数,数到第num个人出列,然后从出列的下一个人重新开始报数,数到第num个人又出列,…,如此反复直到所有的人全部出列为止。比如当n=6,服务器空间,start=1,num=5的时候,出列的顺序依次是5,4,6,2,3,1。
C语言程序:
这是用不带头结点的循环链表实现的
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *link;
}LNode,*LinkList;
int main()
{
LinkList p,r,list=NULL;
int i,n,num,start;
//此处n是指所有人数
//此处start是指从编号为start的人开始报数
//此处num是指数到num的人出列
scanf(“%d%d%d”,&n,&num,&start);
for(i=1;i<=n;i++)
{
p=(LinkList)malloc(sizeof(LNode));
p->data=i;
if(list==NULL)
list=p;
else
r->link=p;
r=p;
}
p->link=list;
p=list;
//以上是构建了一个循环链表,链表不带头结点
for(i=1;i<start;i++)
{
r=p;
p=p->link;
}
//以上是得到了起始编号start的指针p,其前缀指针为r
while(p->link!=p)
{
for(i=1;i<num;i++)
{
r=p;
p=p->link;
}
//此时p是应当被删除的一位,r是p的前缀指针
r->link=p->link;
printf(“%d “,p->data);
free(p);
p=r->link;
}
printf(“\n最后被删除的结点是%d\n”,p->data);
}
这是我实现的程序,因为感觉网上的函数都是封装起来的,所以就自己实现了一遍不用函数封装的程序,虚拟主机,香港虚拟主机,也是很普通的做法,仅供初学者看看吧~~
告诉自己,我这次失败了,重新开始吧!下次我会吸取教训,不让自己犯同样的错误的