# 循环链表约瑟夫问题

2018-01-25 10:57:23来源:网络收集作者:程序诗人人点击

[var1]#include
#include
#define OK 1
#define ERROR 0
typedef int STATUS;
typedef int ElemType;
ElemType data;
}Node;
int main(void)
{
//创建链表
Node * L = (Node*)malloc(sizeof(Node));
L->data = 1;
L->next = L;
Node * p = L,*newp;
for (int i = 2; i <= 41; i++)
{
newp = (Node*)malloc(sizeof(newp));
newp->data = i;
newp->next = L;
p->next = newp;//用于迭代
p = p->next;//这样做是为了获取尾指针 p下面用
}
/*****************************************************
*获取尾指针(遍历的时候 从尾指针开始最方便)
******************************************************/Node * rear = L;
while (rear->next != L)
{
rear = rear->next;
}
//遍历
Node * n = rear->next ;
while (n->next!=L )
{
printf("%d,", n->data);
n = n->next;
}
printf("%d,/n", n->data);
printf("/n");
//---开始 约瑟夫计算--
Node * tmp = rear;//没有头结点的循环链表 从最后一个结点开始遍历（重点！！！！）
while (tmp->next != tmp)
{
tmp = tmp->next->next; //遍历到第二个 tmp->next才是待删除结点
p = tmp->next;
tmp->next = p->next;
printf("->%d", p->data);
}
printf("->%d", tmp->next->data);
system("pause");
return 0;
}