#ifndef _HEAD_H_
#define _HEAD_H_
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct node
{
DataType data;
struct node *next;
}LoopNode;
extern LoopNode *create_empty_looplist();
extern int is_empty_looplist(LoopNode *head);
extern int insert_head_looplist(LoopNode *head,DataType data);
extern int print_looplist(LoopNode *head);
#endif
#include "head.h"
LoopNode *create_empty_looplist()
{
LoopNode *head = NULL;
head = (LoopNode *)malloc(sizeof(LoopNode));
head->next = head;
return head;
}
int is_empty_looplist(LoopNode *head)
{
return head->next == head;
}
int insert_head_looplist(LoopNode *head,DataType data)
{
LoopNode *temp = NULL;
temp = (LoopNode *)malloc(sizeof(LoopNode));
temp->data = data;
temp->next = head->next;
head->next = temp;
return 0;
}
int print_looplist(LoopNode *head)
{
LoopNode *p = head->next;
while(p != head)
{
printf("%d ",p->data);
p = p->next;
}
putchar('\n');
return 0;
}
#if 0
int main()
{
LoopNode *head = NULL;
int i = 0;
head = create_empty_looplist();
if(is_empty_looplist(head))
{
printf("The looplist is empty.\n");
}
for(i = 0;i < 9;i++)
{
insert_head_looplist(head,i);
}
print_looplist(head);
return 0;
}
#endif
#include "head.h"
LoopNode *delete_head_loopnode(LoopNode *head)
{
LoopNode *p = head;
while(p->next != head)
{
p = p->next;
}
//将循环链重新连接
p->next = p->next->next;
free(head);
head = NULL;
return p->next;
}
int _print_looplist(LoopNode *head)
{
LoopNode *p = head->next;
printf("%d ",head->data);
while(p != head)
{
printf("%d ",p->data);
p = p->next;
}
putchar('\n');
return 0;
}
void joseph(int n,int k,int m)
{
LoopNode *head = NULL;
LoopNode *p = NULL;
LoopNode *q = NULL;
int i = 0;
head = create_empty_looplist();
for(i = n;i > 0;i--)
{
insert_head_looplist(head,i);
}
print_looplist(head);
head = delete_head_loopnode(head);
_print_looplist(head);
p = head;
/*print_looplist(had);*/
for(i = 0;i < k - 1;i++)
{
p = p->next;
}
_print_looplist(head);
while(!is_empty_looplist(p))
{
for(i = 0;i < m - 2;i++)
{
p = p->next;
}
q = p->next;
p->next = p->next->next;
printf("%-5d",q->data);
free(q);
p = p->next;
}
printf("%-5d\n",p->data);
//找到第k个人,指针移动(k - 1)次
//循环出列
//数第m个人时,指针移动(m - 1)次,
//若删除第m个人,只能移动指针(m - 2)次
//下一次从下一个人开始数
return 0;
}
int main()
{
int n = 8,k = 3,m = 4;
joseph(n,k,m);
joseph(9,2,3);
return 0;
}