#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include<stdbool.h>
#define N 200
typedef struct _lnode {
int data;
struct _lnode * next;
}lnode,*plnode;
typedef lnode* LinkList;
void GoErr()
{
printf("sorry.an error occurs.\n");
system("pause");
exit(0);
}
bool InitLinkList(LinkList * head)//初始化循环链表
{
if (head == NULL)
return false;
*head = (lnode *)malloc(sizeof(lnode));
if (*head == NULL)
GoErr();
memset(*head, 0, sizeof(lnode));
(*head)->next = *head;
return true;
}
bool CreatLinkList(LinkList *head)//创建循环链表
{
int tmp = 0;
lnode * p = NULL;
lnode *tail = *head;
while (1)
{
printf("input a number\n");
scanf("%d", &tmp);
if (tmp == -1)
break;
p = (lnode *)malloc(sizeof(lnode));
if (p == NULL)
GoErr();
memset(p, 0, sizeof(lnode));
p->next = NULL;
p->data = tmp;
tail->next = p;
tail = p;
tail->next = *head;
}
return true;
}
bool BuildSequentialLink(LinkList *head,int n)
{
int i = 1;
lnode * p = NULL;
lnode *tail = *head;
for (i = 1; i <= n; i++)
{
p = (lnode*)malloc(sizeof(lnode));
if (p == NULL)
GoErr();
memset(p, 0, sizeof(lnode));
p->next = NULL;
p->data =i;
tail->next = p;
tail = p;
tail->next = *head;
}
return true;
}
bool IsLinkListEmpty(LinkList head)
{
return head->next == head;
}
bool PrintLinkList(LinkList head)
{
if (head == NULL)
return false;
if (IsLinkListEmpty(head))
{
printf("empty list.\n");
return true;
}
lnode *cur = head->next;
while (cur != head)
{
printf("%-5d", cur->data);
cur = cur->next;
}
printf("\n");
return true;
}
bool DelNode(LinkList *head, lnode *p)
{
if (head == NULL || p == NULL || *head == NULL)
return false;
if (IsLinkListEmpty(*head))
{
printf("empty list.\n");
return true;
}
if (p == *head)
return true;
lnode *q = *head;
while (!(q->next == p))
q = q->next;
q->next = p->next;
free(p);
p = NULL;
return true;
}
bool Joseph(int total,int outnum)//约瑟夫问题数组解法
{
total = N;
int a[N] = { 0 };
int i = 0;
int count = 1;
int cur = 0;
int left = N;
for (i = 0; i < N; i++)
a[i] = i + 1;
while (left > 1)
{
if (cur == N)
{
cur = 0;
continue;
}
if (a[cur] == -1)
{
cur++;
continue;
}
if (a[cur] != -1 && count == outnum)
{
a[cur] = -1;
left--;
cur++;
count = 1;
continue;
}
else if (a[cur] != -1 && count != outnum)
{
cur++;
count++;
}
}
for (i = 0; i < N; i++)
{
if (a[i] != -1)
printf("%-5d\n", a[i]);
}
return true;
}
void JosephLink(int total,int outnum)//约瑟夫问题循环链表
{
total = N;
LinkList head;
if (!InitLinkList(&head))
GoErr();
printf("linklist built successfully.\n");
InitLinkList(&head);
BuildSequentialLink(&head, total);
PrintLinkList(head);
lnode *cur = head->next;
lnode *tmp = cur;
int count = 1;
while (cur->next->next != cur)
{
if (cur == head)
cur = cur->next;
if (count == outnum)
{
tmp = cur;
cur = cur->next;
DelNode(&head, tmp);
count = 1;
}
else
{
count++;
cur = cur->next;
}
}
PrintLinkList(head);
}
int main()
{
Joseph(N,5);
Joseph(N, 5);
system("pause");
return 0;
}