转载请附上链接:https://blog.csdn.net/qq_37978862/article/details/104604516
一.约瑟夫问题
步骤:
1.初始化基本量以及链表
2.将链表头位置移动到开始位置
3.进入循环,开始游戏
关键:移动到待删位置的前一个位置,
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}node_t;
int main()
{
int i;
int n = 8; //代表总数
int start = 3; //开始位置
int k = 4; //规则,从开始位置数,数到四淘汰
node_t *p;
node_t *h= (node_t *)malloc(sizeof(node_t));
h->data = 1;
h->next = NULL;
p = h; //暂时不能移动头节点,
for( i = 2;i<=n;i++ )
{
node_t *new = (node_t*)malloc(sizeof(node_t));
new->data = i;
new->next = NULL; //创建新节点,并指向插入位置的下一个节点
p ->next = new; //将节点挂在链表上
p = p->next; //指针移动
}
p->next = h; //循环链表
while(--start) //头节点移到起始位置
h = h->next;
//开始游戏,只有不少于一个节点,就一直进行
while( h->next != h