//约瑟夫单循环算法
#include"stdio.h"
#include"stdlib.h"
typedef struct Point
{
int Data;//数据域
struct Point * Next;//指针域
}LNode,*LinkList;
int n,m;//n代表总人数,m代表出列的人序号
//创建单循环链表并返回
LinkList Create()
{
int i;
LinkList head,tail,NewNode;//创建三个节点
head = NULL;
printf("请输入总人数:\n");
scanf("%d",&n);
printf("请输入将要出列人的序号:\n");
scanf("%d",&m);
for(i = 1;i <= n;i++)
{
NewNode = (LinkList) malloc (sizeof(LNode));
NewNode ->Data = i;
if(head == NULL)//插入链表的第一个节点
{
head = NewNode;
tail = NewNode;
}
else
{
tail ->Next = NewNode;
tail = NewNode;
}
}
tail ->Next = head;
return head;
}
//用单向链表实现报数问题
void Search(LinkList head)
{
int count,num;
LinkList pre,p;
num = 0;
count = 1;
p = head;
printf("输出处理后的序列:\n");
while(num < n)
{//累计报数
do
{
count++;
pre = p;
p = p->Next;
}while(count < m);
pre ->Next = p ->Next;//报m的人出列
printf("%3d",p->Data);
free(p);
p = pre ->Next;
count = 1;
num++;
}
printf("\n");
}
main()
{
LinkList head;
head = Create();
Search(head);
}
/*
2012年11月3日10:58:38
输出结果:
请输入总人数:
8
请输入将要出列人的序号:
2
输出处理后的序列:
2 4 6 8 3 7 5 1
*/