Joseph问题——C语言实现

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);

}

这是我实现的程序,因为感觉网上的函数都是封装起来的,所以就自己实现了一遍不用函数封装的程序,虚拟主机,香港虚拟主机,也是很普通的做法,仅供初学者看看吧~~

告诉自己,我这次失败了,重新开始吧!下次我会吸取教训,不让自己犯同样的错误的

Joseph问题——C语言实现

相关文章:

你感兴趣的文章:

标签云: