#include <stdio.h>
#include <malloc.h>
/*利用链表实现*/
typedef struct link{
int data;
struct link *next;
}link_s, *link_p;
/*创建循环链表*/
void link_create(link_p &head, int num)
{
if (num < 1)
{
head = NULL;
return;
}
head = (link_p)malloc(sizeof(link_s));
head->data = 1;
head->next = NULL;
link_p new_node = head;
for (int i = 2; i < num+1; i++)
{
new_node->next = (link_p)malloc(sizeof(link_s));
new_node = new_node->next;
new_node->data = i;
new_node->next = NULL;
}
new_node->next = head; /*把最后一个节点指向头结点,构成循环链表*/
return;
}
/*打印链表,验证是否为循环链表*/
void link_print(link_p head)
{
int i = 0;
link_p p_node = head;
while (p_node && i < 100)
{
printf("%d->", p_node->data);
p_node = p_node->next;
i++;
}
return;
}
/*实现功能从1至N开始顺序循环数数,每数到M输出该数值*/
void fun_realize(link_p head, int num)
{
int i = 1, remove_num = 1;
link_p p_node = head;
link_p p_temp = NULL;
while (p_node)
{
if (num - 1 == i)
{
if (p_node == p_node->next) /*剩下最后一个节点时,直接打印*/
{
printf("num.%d remove %d\n", remove_num, p_node->data);
free(p_node);
p_node = NULL;
break;
}
i = 1;
printf("num.%d remove %d\n", remove_num, p_node->next->data); /*找到第M-1个节点,打印第M个节点*/
p_temp = p_node->next->next; /*保存第M+1个节点地址*/
free(p_node->next); /*释放第M个节点地址*/
p_node->next = p_temp; /*第M-1个节点指向第M+1个节点*/
p_node= p_node->next; /*p_node指向第M+1个节点*/
remove_num++;
}
else
{
i++;
p_node = p_node->next;
}
}
return ;
}
int main(void)
{
int n = 0, m = 0;
printf("input n and m: ");
scanf("%d %d", &n, &m);/*用户输入*/
getchar();
link_p lk = NULL;
link_create(lk, n);
fun_realize(lk, m);
getchar();
return 0;
}
输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出(约瑟夫环问题)
最新推荐文章于 2021-05-20 00:03:33 发布