问题:
有n个小朋友,编号反别为:1,2,3,…,,n,按编号围成一个圈,他们按顺时针方向从编号为k的人开始报数,报数为m的人出列,编一个算法,输入n,m,k,按照出列顺序输出编号。
分析:
(1)创建循环链表
(2)找到看第k个小朋友;
(3) 报到m的人节点删除;
代码:
// DoubleLinkedList.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node * next;
struct Node *prior;
}DListNode,*DLinkList;
DLinkList CreateDCList(int n)//创建长度为n的双向循环链表,1,2,3,。。。。,n
{
DLinkList h;//不带投结点
h = NULL;
int i;
DListNode *s,*q;
q = NULL;
for (i = 1; i <= n; i++)
{
s = (DListNode*)malloc(sizeof(DListNode));
if (s)
{
s->data = i;
s->next = NULL;
}
//如果是第一个节点
if (h == NULL)
{
h = s;
s->prior = h;
s->next = h;
}
else
{
s->next = q->next;
q->next = s;
s->prior = q;
h->prior = s;
}
q = s;//q指向最后一个节点
}
return h;
}
void Josephus(DLinkList h, int n, int m, int k) //从第k个人开始报数,报数为m的人出列,输出出列的人的序列
{
if (k > n)
{
printf("k不合法\n");
return;
}
//首先找到第k个人
DListNode *p,*q;
int i = 1;
p = h;
while (i < k)
{
p = p->next;
i++;
}
if (i != k)
{
printf("未找到第k个人\n");
return;
}
//printf("找到了第k个人:%d", p->data);
while (p->next != p)
{
for (i = 1; i < m; i++)
{
p = p->next;
}
//删除第m个节点
printf("编号为%d的人出列\n", p->data);
q = p;
q->prior->next = q->next;
q->next->prior = q->prior;
p = p->next;
free(q);
}
}
int InsertDList(DLinkList h, int i, DataType e) //在第i个位置插入
{
//找到第i个节点
DListNode *p;
DListNode *s;
int j;
j = 1;
p = h->next;
while (p!= h&&j < i)
{
p = p->next;
j++;
}
if (j != i)
{
printf("插入位置不正确\n");
return 0;
}
//申请一块内存
s = (DLinkList)malloc(sizeof(DLinkList));
if (!s)
return 0;
s->data = e;
s->prior = p->prior;
p->prior->next = p;
s->next = p;
p->prior = s;
return 1;
}
int DeleteDList(DLinkList h, int i)//删除dii个节点
{
int j;
j = 1;
DListNode *p;
p = h->next;
while (p!=h&&j<i)
{
p = p->next;
j++;
}
if (j != i)
{
printf("插入位置错误!\n");
return 0;
}
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
return 1;
}
int main()
{
DLinkList h;
int n, m, k;
printf("输入人的个数: \n");
scanf_s("%d", &n);
printf("输入从第几个人开始报数: \n");
scanf_s("%d", &k);
printf("输入数到几的人出列: \n");
scanf_s("%d", &m);
h = CreateDCList(n);
Josephus(h,n, m, k);
}