Josephus环问题,利用链表结构建立一个循环链表,遍历循环链表,每数到3,删除这个节点,直到只剩一个,即首节点等于尾节点。 下面是完整c代码:
#include
#include
typedef struct node *linklist;
struct node {
int item;
linklist next;
};
linklist create_node(int item, linklist next)
{
linklist t = (linklist)malloc(sizeof *t);
if(t == NULL)
{
printf("malloc error!\n");
exit(1);
}
t->item = item;
t->next = next;
return t;
}
int josephus(int n, int m)
{
int i;
linklist t = (linklist)create_node(1, NULL);
t->next = t;
for(i=2; i<=n; i++)
t = t->next = create_node(i, t->next);
while(t != t->next)
{
for(i=1; i
t->next = t->next->next;
}
return t->item;
}
int main(void)
{
int n;
printf("Enter n = ");
scanf("%d", &n);
printf("The last one is%d\n",josephus(n, 3));
return 0;
}
#include "stdio.h"//
#include "stdlib.h"//
void main(void){
int *p,n,i,j,x;
printf("How many people?\nn=");
scanf("%d",&n);
if(!(p=(int *)malloc(n*sizeof(int)))){
printf("Application memory failure...\n");
return;
}
for(i=0;i
if(j==n){
j=-1;
continue;
}
if(p[j]==0) continue;
if(++i==3){
i=p[j]=0;
x++;
}
if(x==n){
printf("%d\n",j+1);
break;
}
}
free(p);
}
定义一个结构,
typedef struct CIRCLE{
int index;
bool active;
CIRCLE *pre;
CIRCLE *nxt;
}CIRCLE;
声明一个这个结构的指针;
CIRCLE *circle;
int n;
scanf("%d", %n);
CIRCLE *start;
if(n>0) circle=malloc(n*sizeof(CIRCLE ));
start = circle;
再初始化成循环双向链表,即成为一个环,从start开始,用一个变量记录索引,只需加大3即归1,且遇3则删除当前这里链表单元-实际上就是让这个单元的上一单元pre的nxt指向这个单元的nxt指向的单元(这个会吧?)
循环操作直到链表中仅剩一个单元。