作业:使用单向循环链表,完成约瑟夫环问题

函数:looplink.h

#ifndef __LOOPLINK_H__
#define __LOOPLINK_H__

typedef int datatype;
typedef struct Node
{
	union
	{
		datatype data;
		int len;
	};
	struct Node *next;
}*LoopLink,Node;

//创建
LoopLink list_create();

//判空
int list_empty(LoopLink L);

//申请结点封装数据
LoopLink apply_node(datatype e);

//头插
int list_insert_head(LoopLink L,datatype e);

//遍历
void list_show(LoopLink L);

//约瑟夫环
void joseph(LoopLink L,int k);

#endif

函数:looplink.c

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


//创建
LoopLink list_create()
{
	LoopLink L = (LoopLink)malloc(sizeof(Node));
	if(NULL==L)
	{
		printf("创建失败\n");
		return NULL;
	}

	//初始化
	L->len = 0;
	L->next = L;

	printf("创建成功\n");
	return L;
}

//判空
int list_empty(LoopLink L)
{
	return L->next==L;    //1表示空  0表示非空
}

//申请结点封装数据
LoopLink apply_node(datatype e)
{
	LoopLink p = (LoopLink)malloc(sizeof(Node));
	if(NULL==p)
	{
		printf("结点申请失败\n");
		return NULL;
	}

	//将数据封装到节点
	p->data = e;
	p->next = NULL;

	return p;
}

//头插
int list_insert_head(LoopLink L,datatype e)
{
	//判断逻辑
	if(NULL==L)
	{
		printf("链表不合法\n");
		return -1;
	}

	//申请结点封装数据
	LoopLink p = apply_node(e);
	if(NULL==p)
	{
		return -2;
	}

	//头插逻辑
	p->next = L->next;
	L->next = p;

	//表长变化
	L->len++;
	printf("插入成功\n");
	return 0;
}

//遍历
void list_show(LoopLink L)
{
	//判断逻辑
	if(NULL==L)
	{
		printf("便利失败\n");
		return ;
	}

	//遍历
	LoopLink q = L->next;
	while(q != L)
	{
		printf("%d\t", q->data);
		q = q->next;
	}

	printf("\n");
}



//约瑟夫环
void joseph(LoopLink L,int k)
{
	//判断逻辑
	if(NULL==L)
	{
		printf("链表不合法\n");
		return ;
	}

	LoopLink p = L;
	LoopLink q;
	for(int i=0; i<8; i++)
	{
		//k代表每数到k,删除一个
		for(int j=0; j<k-1; j++)
		{
			p = p->next;
			if(p==L)
				j--;
		}

		//q为要删除的结点
		q = p->next;
		if(q==L)
			q = L->next;

		//输出并删除q
		printf("%d\t", q->data);
		p->next = q->next;
		free(q);
		L->len--;
	}

	printf("\n");
	return ;
}

函数:main.c

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

int main(int argc, const char *argv[])
{
	LoopLink L = list_create(L);
	if(NULL==L)
	{
		return -1;
	}

	//输入数据
	for(int i=8; i>0; i--)
	{
		list_insert_head(L, i);
	}
	list_show(L);

	//调用约瑟夫环函数
	joseph(L, 4);

	return 0;
}

结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值