C语言-实现约瑟夫环

链式解法:

#include<stdio.h>
#include<stdlib.h>

typedef struct sqlist
{
int data;
struct sqlist* next;
}SqList;

//创建解约瑟夫环需要的链表,该链表不带头节点
SqList* CreatList(int Length)
{
SqList *head, *p, *temp;
int i = 0;
//先创建普通链表
head = (SqList *)malloc(sizeof(SqList)), head->data = -1; //为创建链表方便,暂时加上头结点
p = head;

if (0 == Length)
return;
for (i = 1; i <= Length; i++)
{
p->next = (SqList *)malloc(sizeof(SqList));
p = p->next;
p->data = i;
}
p->next = NULL;
/*普通链表转不带头结点的循环链表,就是将头指针下移到第一个节点位置
原来的头结点删掉,剩最后一个节点的判断条件就是head == head->next*/
temp = head; //先保存下来头结点,之后删除用
p->next = head->next; //头尾链接
head = head->next; //头结点下移
free(temp); //释放头节点
return head; //返回链表头
}

int main(void)
{
SqList *list, *p, *temp;
int length, n; //人数,出队号(出队号肯定不是1)
int i; //计算控制变量

//初始化相关变量
list = p = temp = NULL;
//输入数据
printf(“Input: “);
scanf_s(“%d%d”, &length, &n);
//创建链表
list = CreatList(length);
//找出最后一个幸运者
p = list;
while (p != p->next) //不是只有一个元素时
{
for (i = 1; i < n – 1; i++)
p = p->next;
if (p != p->next) //不是最后一个元素时
{
temp = p->next;
p->next = temp->next;
printf(“%d “, temp->data);
free(temp);
p = p->next;
}
}
printf(“\nThe last one’s number is %d\n”, p->data);

system(“PAUSE”);
return 0;
}

《C语言-实现约瑟夫环》

顺序表解法:

#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0

int main(void)
{
int *p = NULL;
int num, n, i, j, k;
num = n = i = j = k = 0;

printf(“Input: “);
scanf_s(“%d%d”, &num, &n);
//初始化表和相关值
p = (int *)malloc(sizeof(int)*(num + 1)); //为理解方便,p[0]空间不用
for (i = 1; i <= num; i++)
p[i] = i;
k = 0, j = 0, i = 1; //k计出队人数,j循环间隔,下标初始位置
while (TRUE)
{
//找出队的那个人
while(TRUE) //初始状态下下标已经指在第一个位置,所以要做特殊处理
{
//判断位置是否有效,有效计入间隔计数
if (p[i] != 0)
{
//有效计数
j++;
if (j == n) //判断计数值是否达到出队要求
{
j = 0; k++; break;
}
}
//下标下移,考虑循环
if (i == num) i = 1; else i++;
}
//判断是不是最后一个人
if (k == num)
{
printf(“\nThe last one’s ID is %d.\n”, p[i]); break;
}
else
printf(“%d “,p[i]), p[i] = 0;
}

system(“PAUSE”);
return 0;
}

《C语言-实现约瑟夫环》

 

 

    原文作者:约瑟夫环问题
    原文地址: https://blog.csdn.net/gulang03/article/details/78428201
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞