约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
void Joseph_Ring(pLinkList plist,int m)//约瑟夫环
{
pLinkNode cur = plist->_pHead;
pLinkNode tmp = cur;
int n = m;
while(plist->_pHead!=NULL)
{
n--;
if (n==0)
{
printf("%d ", cur->_data);
if (tmp->next == plist->_pHead)//当对应要删除节点为头指针指向的,则应该修改头指针指向
{
if (tmp->next == tmp)//当最后一节点要删除时,将头指针置为空
{
plist->_pHead = NULL;
}
else
plist->_pHead = cur->next;
}
tmp->next = NULL;
free(tmp->next);
tmp->next = cur->next;
n = m;
}
tmp = cur;
cur = cur->next;
}
printf("NULL\n");
}测试代码
void test9()
{
LinkList p1;
pLinkNode cur = NULL;
Init_LinkList(&p1);
Push_Back(&p1, 1);
Push_Back(&p1, 3);
Push_Back(&p1, 4);
Push_Back(&p1, 0);
Push_Back(&p1, 2);
Push_Back(&p1, 6);
Push_Back(&p1, 5);
Push_Back(&p1, 7);
Push_Back(&p1, 9);
Push_Back(&p1, 8);
Bubble_Sort(&p1);
//Print_LinkList(&p1);
Find_NUM(&p1, 9)->next = Find_NUM(&p1, 0);
Joseph_Ring(&p1, 3);
}
370

被折叠的 条评论
为什么被折叠?



