约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。
环境:DEV C++
下面我们用顺序表实现约瑟夫问题,结果图如下:
用顺序表实现约瑟夫问题,完整代码如下:
#include<stdio.h>
#include<stdlib.h>
#define Maxsize 30
struct SqList
{
int Data[Maxsize];
int length;
};
typedef struct SqList SqList;
void InitList(SqList *&L)
{
L = (SqList *)malloc(sizeof(SqList));
L->length = 0;
}
void CreateList(SqList *&L)
{
int i;
int people;
printf("请输入队列总人数:\n");
scanf("%d",&people);
printf("\n");
printf("队列序号是:\n");
for (i=0; i<people; i++)
{
L->Data[i] = i + 1;
printf("%d ", L->Data[i]);
}
printf("\n");
L->length = people;
}
void DisplayList(SqList *L)
{
int m, i, j;
int k=0;
printf("\n");
printf("请输入第几个报数的人出列: \n");
scanf("%d", &m);
printf("\n");
printf("出列次序依次是:\n");
for (i=L->length; i>0; i--)
{
k=(k+m-1)%i;
printf("%d ",L->Data[k]);
for (j=k;j<i-1; j++)
{
L->Data[j] = L->Data[j+1];
}
L->length = L->length - 1;
}
printf("\n");
}
int main()
{
SqList *L;
InitList(L);
CreateList(L);
DisplayList(L);
}
用循环单链表实现的约瑟夫问题:
#include<stdio.h>
#include<malloc.h>
struct Node
{
int data;
struct Node *next;
};//建立一个结点结构体
int main()
{
struct Node *head, *s, *q, *t;
int n, m, count=0, i;
printf("输入总人数 m:\n");
scanf("%d",&m);
printf("\n");
printf("输入报到第几个出列 n:\n");
scanf("%d",&n);
for(i=0; i<m; i++)
{
s=(struct Node *)malloc(sizeof(struct Node));
s->data=i+1;
s->next=NULL;
if(i==0)
{
head=s;
q=head;
}
else
{
q->next=s;
q=q->next;
}
}//建立一个不带头结点的单链表
q->next=head;//将单链表组成环状,形成循环单链表
printf("\n");
printf("之前的序列为:\n");
q=head;
while(q->next!=head)
{
printf("%d ",q->data);
q=q->next;
}//依次输出结点的值
printf("%d ",q->data);
q=head;
printf("\n");
printf("\n");
printf("依次出列的顺序是:\n");
do {
count++;//计数器开始计数
if(count==n-1)
{
t=q->next;
q->next=t->next;//到n前面那个节点停止,然后删除第n个节点
count=0;//计数器复位
printf("%d ", t->data);//输出被淘汰的号码
free(t);//释放内存,防止内存泄露
}
q=q->next;
}
while(q->next!=q);
printf("\n");
printf("\n");
printf("最后剩下的人是: %d ",q->data);
}
希望能帮助到各位浏览者