您的位置:首页 > 其它

循环链表与约瑟夫问题

2014-08-10 16:30 295 查看
n个人围坐一桌,从编号m开始数,数到k就取出,从k的下一个人开始又从m开始数......知道所有的去掉,输出结果为:从第一次开始到最后一次的数字

#include<iostream>

#include<stdlib.h>

#include<stdio.h>

//定义一个n个节点的链表,无头结点的循环链表

typedef struct LNode

{

int datda;

struct LNode *LNode;

}LNode, *LinkList;

//定义这个函数

void JOSEPHUS(int n,int m,int k)

{

/*

p为当前节点,r为辅助节点,指向p的前驱节点,list为头结点

*/

LinkList p,r,list,curr;

/*建立循环链表*/

p=(LinfList)malloc(sizeof(LNode));

p->data=0;

p->link=p;

curr=p;

for(int i=1;i<n;i++)

{

LinkList t=(LinkList)malloc(sizeof(LNode));

t->data=i;

t->link=curr->link;

curr->link=t;

curr=t;

}

/*

把当前指针移动到第一个报数的人

*/

r=curr;

while(k--) r=p,p=p->link;//因为是循环的,所以从最后一个数字开始,向前推进k次,就一定能到达数字k

while(n--)

{

for(int s=m-1;s--;r=p,p->link)

r->link=p->link;

printf("%d->",p->data);

free(p);

p=-r->lik;

}

}

int mian()

{

JOSEPHUS(13,4,1);

}

有两点值得注意:1)在家里循环链表后,给循环链表赋值的时候,想要找到值为k的数字,直接往前推进K个位置就可以,因为这是循环链表

2)想要删除第m个人,也是一直往前推进m-1就可以了,因为这是循环链表

运行结果:


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: