josephus问题——顺序表与链表求解

josephus问题

问题描述:
设有N个人围坐在一个圆桌的周围,现从第s个人开始报数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m的人又出列。。。如此反复,直到所有人出列。
选自算法与数据结构——C语言描述第三版。张乃孝。

书中给的代码,比较繁杂且使用了ADT的一些函数,我自己上机写了对应的顺序表与链表的代码,经自测无误,上传代码,以供网友参考。
**注:**代码直接复制粘贴可运行,为方便调试加上while(1);如果在linkcode等网站刷题,应去掉while(1),编号从1~n,数组不使用a【0】。
编译环境:dev-c++ 编译语言:C语言
顺序表

#include <stdio.h>
#include <stdlib.h>

int main() 
{

		int n,m,i,curr = 1,count= 0;
		int a[999] = {0};		//a[curr] = 0表示curr再表里 1表示不在表里
	
	
		printf("please input total number n and step lenth m\n");
		scanf("%d%d",&n,&m);

		for(i= 0;i<n;i++)
		{

		while(count<m)		//若a【curr】在数组中,则记步数,否则不计 
		{
			if(a[curr] == 0)count++;
			curr = curr%n;
			curr++;
		}
		
		curr--;				//使curr表示当前序号 
		
		count= 0;
		if(curr)
		{
			printf("%d\n",curr);	
			a[curr] = 1;
		}
		else
		{
			printf("%d\n",n);
			a[n] = 1;	
		}
		
		curr++;				//补偿curr使之满足循环 
		
	}
	
	while(1);
	return 0;
}

链表

#include <stdio.h>
#include <stdlib.h>

typedef struct Node* Link;
typedef struct Node{
    int Num;
    Link Next;
}node;

int main()
{
	int n ,m,i,j;
	printf("please input total number n and step lenth m\n");
	scanf("%d%d",&n,&m);
	
	printf("n is %d,m is %d\n",n,m);

	Link curr = (Link)malloc((sizeof(struct Node)));
	Link head = (Link)malloc((sizeof(struct Node)));
	Link rear = (Link)malloc((sizeof(struct Node)));
	Link pre = (Link)malloc((sizeof(struct Node)));
	
			
	curr = head;
	head->Num = 1;
	head->Next = NULL;
	
	for(i=2;i<=n;i++)					//初始化链表 
	{
		Link node = (Link)malloc((sizeof(struct Node)));
		
		node->Num = i;
		node->Next = NULL;
		if(i==2)head->Next = node;
		curr ->Next = node;
		curr = node;
	}

	curr->Next = head;
	rear = curr;
	
	for(i= 0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			pre = curr;
			curr = curr->Next;
		}

		printf("%d\n",curr->Num);
		pre->Next = curr->Next;
		
		Link tmp = curr;
		free(tmp);
		
		curr = pre;
	
	}
	
	printf("in the end of code");
    while(1);
    return(0);
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值