#include <corecrt_malloc.h>
#include <stdio.h>
constexpr auto OK = 1;
constexpr auto Error = 0;
constexpr auto True = 1;
constexpr auto False = 0;
typedef int Status;
typedef int ElemType;
//定义双链表结构体
typedef struct Temp
{
ElemType data; //数据
struct Temp* Next;
}CircularLinkedList;
//初始化循环链表
Status InitLinkedList(CircularLinkedList*& list)
{
list = (CircularLinkedList*)malloc(sizeof(Temp));
if (!list)
{
return Error;
}
list->data = NULL;
list->Next = list;
return OK;
}
//传入数据
Status createLinkedList(CircularLinkedList* list, int n)
{
if (n < 1)
return Error;
CircularLinkedList* node = list;
node->data = 1;
for (int j = 2; j <= n; j++)
{
CircularLinkedList* newList = (CircularLinkedList*)malloc(sizeof(Temp));
if (!newList)
return Error;
newList->Next = node->Next;
node->Next = newList;
newList->data = j;
node = newList;
//printf("数据%d\n", newList->data);
}
return OK;
}
//约瑟夫环函数
//Input: m:每第m个人淘汰,n:总数
Status JosephRing(CircularLinkedList* list, int n, int m)
{
if (!list)
return Error;
CircularLinkedList* node=NULL;
CircularLinkedList* del = list;
while (n > 1)
{
for (int i = 0; i < m - 1; i++)
{
node = del;
if (!(node->Next))
{
return false;
}
del = node->Next;
}
//delNode = node->Next;
//node->Next = node->Next->Next;
if (del&&node) //判断del和node是否空指针
{
node->Next = del->Next;
printf("删除第%d个数据\n", del->data);
//free(del);
del = node->Next;
}
n--;
}
if (del)
{
printf("剩余第%d个数据\n", del->data);
}
return OK;
}
void CiecleListOperate()
{
CircularLinkedList* list;
int X = 10, Y = 6;
InitLinkedList(list);
createLinkedList(list, X);
JosephRing(list, X, Y);
}
c语言实现约瑟夫环
最新推荐文章于 2021-11-21 09:14:01 发布