#include <stdio.h>
#include <stdlib.h>
struct node //定义链表节点
{
int num; //数据域存放1整型数据
struct node * next; //指针域指向自己同类型
};
typedef struct node Node; //重命名节点结构题
typedef Node * Link; //重命名结构体指针
/* 函数名:Link_create
* 参数:结构体指针的指针(为将值带回)
* 返回值:无
* 调用函数:无
* 被调函数:main()
* 概述:创建一个空链表
*/
void Link_create(Link * head)
{
*head = NULL;
}
/* 函数名:Link_insert_tail
* 参数:结构体指针的指针(为将值带回);整型数据,为插入数据
* 返回值:无
* 调用函数:无
* 被调函数:main()
* 概述:将数据插入在链表尾部
*/
void Link_insert_tail(Link * head,int num)
{
Link new_node = (Link)malloc(sizeof(Node));//分配空间
new_node->num = num;//存入数据
Link p;
p = *head;//保护头指针
if (p == NULL)//往空链表插入
{
new_node->next = NULL;
*head = new_node;
}
else
{
while (p->next != NULL)//找尾节点
{
p = p->next;
}
new_node->next = NULL;
p->next = new_node;//插入新节点
}
}
/* 函数名:Josephus
* 参数:结构体指针的指针(为将值带回)
* 返回值:无
* 调用函数:无
* 被调函数:main()
* 概述:完成约瑟夫环问题
*/
void Josephus(Link * head)
{
Link p,q;
p = *head;
while (p->next != NULL)//寻找尾节点
{
p = p->next;
}
p->next = *head;//成环
p = p->next;//移到头节点
while (p != p->next)//判断是否只剩下一个数据
{
q = (p->next)->next;//将逢3的节点取出
p = (p->next)->next = ((p->next)->next)->next;//将逢3的节点短路
free(q);//将q释放
}
printf("The remain num is %d\n",p->num);//输出剩下的数据
free(p);//释放
*head = NULL;//将头指针指向空链表
}
/* 函数名:main
* 参数:无
* 返回值:整型(无意义)
* 调用函数:Link_create,Link_insert_tail,Josephus
* 被调函数:无
* 概述:创建约瑟夫环,并解决问题
*/
int main()
{
Link head;
Link_create(&head);//创建一个空链表
int n,i;
printf("enter the num:");
scanf("%d",&n);
for (i = 1; i <= n; i++)//创建一个升序链表
{
Link_insert_tail(&head,i);
}
Josephus(&head);//解决约瑟夫问题
return 0;
}
---------------------
作者:不会水的鸟
来源:优快云
原文:https://blog.youkuaiyun.com/weixin_42425796/article/details/87115674
版权声明:本文为博主原创文章,转载请附上博文链接!
用环形链表解决约瑟夫环
最新推荐文章于 2024-09-27 17:27:15 发布