单链表实现约瑟夫问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单链表解决约瑟夫问题
代码实现:
#include
#include
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node *next;
}ListNode, *LinkList;
LinkList CreateCycList(int n){
LinkList head = NULL;
ListNode *s, *r;
int i;
for (i = 1; i <= n; i++)
{
s = (ListNode*)malloc(sizeof(ListNode));
s->data = i;
s->next = NULL;
if (head == NULL)
head = s;
else
r->next = s;
r = s;
}
r->next = head;
return head;
}
void DisplayCycList(LinkList head){
ListNode *p;
p = head;
if (p == NULL)
{
printf("该链表是空表");
return;
}
while (p->next != head)
{
printf("%2d", p->data);
p = p->next;
}
printf("%2d\n", p->data);
}
void Josephus(LinkList head, int n, int m, int k) {
ListNode *p, *q;
int i;
p = head;
for (i = 1; i { q = p; p = p->next; } while (p->next != p) { for (i = 1; i { q = p; p = p->next; } q->next = p->next; printf("%2d", p->data); free(p); p = q->next; } printf("%2d\n", p->data); } void main(){ LinkList h; int n, k, m; printf("输入环中人的个数,n="); scanf("%d", &n); printf("输入开始报数的序号,k="); scanf("%d", &k); printf("报数为m的人出列,m="); scanf("%d", &m); h = CreateCycList(n); Josephus(h, n, m, k); }