C语言(顺序表)实现约瑟夫问题

约瑟夫问题是个有名的问题: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);
}

希望能帮助到各位浏览者

发布了5 篇原创文章 · 获赞 36 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40311281/article/details/96352392