用循环链表求解约瑟夫环问题。
/***************************************************
Copyright (c) 2015 Jingshuang Hu
@filename:demo.c
@datetime:2015.09.18
@author:HJS
@e-mail:eleftheria@163.com
@blog:http://blog.csdn.net/hujingshuang
****************************************************/
#include <stdio.h>
#include <stdlib.h>
/***************************************************/
typedef struct node
{
int data;
struct node *next;
}Lnode, *LinkList;
/***************************************************/
LinkList List_Init(void);
void List_Joseph(LinkList h, int n, int m, int k);
int List_Show_Length(LinkList h);
void List_Show_All(LinkList h);
/***************************************************/
int main()
{
LinkList p;
int pos = 0, value = 0;
p = List_Init();
List_Show_Length(p);
List_Show_All(p);
List_Joseph(p, List_Show_Length(p), 5, 3);
return 0;
}
/***************************************************/
LinkList List_Init(void)
{
int i = 0, num = 0, value = 0;
LinkList h = NULL;
LinkList p, q;
printf("循环链表个数:");
scanf("%d", &num);
for(i = 0; i < num; i++)
{
scanf("%d", &value);
p = (LinkList)malloc(sizeof(Lnode));
p->data = value;
p->next = NULL;
if (h == NULL)
{
h = p;
}
else
{
q->next = p;
}
q = p;
}
p->next = h;
return h;
}
/***************************************************/
//元素:n 位置:m 间隔:k
void List_Joseph(LinkList h, int n, int m, int k)
{
LinkList p = h, q;
int i = 0, len = 0;
for (i = 1; i < m; i++)
{
q = p;
p = p->next;
}
while(len < n)
{
for (i = 0; i < k; i++)
{
q = p;
p = p->next;
}
printf("%d ", p->data);
q->next = p->next;
free(p);
p = q->next;
len++;
}
}
/***************************************************/
int List_Show_Length(LinkList h)
{
LinkList p = h;
int length = 0;
if (p->next == h)
{
printf("表空!\n");
}
else
{
do
{
length++;
p = p->next;
}while(p != h);
printf("表长:%d\n", length);
}
return length;
}
/***************************************************/
void List_Show_All(LinkList h)
{
LinkList p = h;
if (p->next == h)
{
printf("表空!\n");
}
else
{
printf("元素:");
do
{
printf("%d ", p->data);
p = p->next;
}while(p != h);
printf("\n");
}
}