线性表的应用举例
Josephu问题
Josephu问题:设标号为1,2,3....n的n个人围坐一圈,约定序号为K的人从1开始计数,数到m的那个人出列,他的下一位又开始计数,数到m的那个人又出列,以此类推,直到所有的人出列为止
算法分析:Josephu问题用一个不带头结点的单向循环链表处理起来会很容易实现
C语言代码实现
#include<stdio.h>
#include<malloc.h>
#include<conio.h>
typedef struct node
{
int No;
struct node* next;
}Node,*Link;
Link CreateRoute(int n)
{
int i;
Link tail=NULL;
Link Head=NULL;
for (i = 1; i <= n; i++)
{
if (i == 1)
{
Head=tail= (Link)malloc(sizeof(Node));
}
else
{
tail->next = (Link)malloc(sizeof(Node));
tail = tail->next;
}
tail->No = i;
}
tail->next = Head;
return Head;
}
void PrintLineByOrder(Link L, int n, int k, int m )
{
int i,j;
Link p = L;
Link q=p;
for (i = 1; i < k; i++)
{
p = p->next;
}
for (i = 1; i <= n; i++)
{
for (j = 1; j < m; j++)
{
q = p;
p = p->next;
}
q->next = p->next;
printf("%d", p->No);
p = p->next;
}
}
void main()
{
int n, m, k;
Link Head = NULL;
printf("Please input the Amount of person\n");
scanf_s("%d", &n);
printf("Plase input the number of the beginer\n");
scanf_s("%d", &k);
printf("Please input the number of where counting to\n");
scanf_s("%d",&m);
Head = CreateRoute(n);
PrintLineByOrder(Head, n, k, m);
}
浙公网安备 33010602011771号