C语言用链表解决约瑟夫问题


#include<stdio.h>
#include<malloc.h>

#define LPRO sizeof(struct Pro)

struct Pro *create(int x);    // 建表,x表示总人数
struct Pro *print(struct Pro *head, int x); // 打印目标节点,传入头指针和总人数
struct Pro *delet(struct Pro *pre, struct Pro *p); // 删除目标节点,传入目标节点前驱和目标节点

struct Pro
{
	int num;
	struct Pro *next;
};

int main()
{
	struct Pro *head;
	head = create(41);  // 建立有41个节点的单链表
	print(head, 41);	// 打印目标节点
	return 0;
}

struct Pro *create(int x) // 建表,x表示总人数
{
	int i = x;
	struct Pro *head, *p, *tail;

	head = (struct Pro *)malloc(LPRO);
	head = NULL;

	do
	{
		p = (struct Pro *)malloc(LPRO);
		p->num = i;
		if(i == x)
		{
			tail = p;
		}
		i--;
		p->next = head;
		head = p;
	}while(i);
	tail->next = p;	
	return tail;
}

struct Pro *print(struct Pro *head, int x)	// 打印目标节点,传入头指针和总人数
{
	int i;
	struct Pro *p, *pre;
	p = head;
	while(x)
	{
		for(i = 0; i < 3; i++)    // 寻找目标节点
		{	
			pre = p;
			p = p->next;
		}	
		printf("%-4d", p->num);	
		p = delet(pre, p);		// 删除目标节点
		x--;
	}
	return 0;
}

struct Pro *delet(struct Pro *pre, struct Pro *p)  // 删除目标节点,传入目标节点前驱和目标节点 
{
	pre->next = p->next;
	free(p);
	return pre;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值