数据结构之约瑟夫环(循环链表实现)

目录

约瑟夫环的图片解释

约瑟夫环的代码实现

接下来是整个looplink的函数,对于循环链表的一系列操作。

创建循环链表

判空

 尾插

带头结点的遍历

尾删法

删除头结点

删除头结点的遍历


约瑟夫环的图片解释

 

约瑟夫环的代码实现

//约瑟夫环
int list_huan(Looplink *S,int n,int m)
{
	Looplink *p=S;
	printf("约瑟夫环实现后:");
	for(int j=0;j<n;j++)
	{
		for(int i=0;i<m-2;i++)
		{
			p=p->next;
		}
		Looplink *q=p->next;
		printf("%d\t",q->data);
		p->next=q->next;
		p=p->next;
		free(q);
		q=NULL;

	}	  

	printf("\n");

}

其中n代表人数,m代表到第m个出圈,从m+1个重新遍历。

我是删除出圈结点的同时输出这个结点的信息,从而实现了对约瑟夫环。

接下来是整个looplink的函数,对于循环链表的一系列操作。

创建循环链表

//创建
Looplink *list_create()
{

	Looplink *L=(Looplink *)malloc(sizeof(Looplink));
	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;
}

 尾插

//尾插
int list_insert_tail(Looplink *L,datatype e)
{
  

	if(NULL==L)
	{
		printf("所给链表不合法\n");
		return -1;
	}

    Looplink *p=(Looplink*)malloc(sizeof(Looplink));
	if(NULL ==p)
	{
		printf("结点申请失败\n");
		return -2;
	}

	p->data =e;
	p->next =NULL;

	Looplink *q=L;
	while(q->next !=L)
	{
		q=q->next;
	}
	p->next=L;
	q->next=p;

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

带头结点的遍历

//带头结点的遍历
void list_show(Looplink *L)
{
	if(NULL ==L || list_empty(L))
	{
		printf("遍历失败\n");
		return ;
	}
	printf("元素是:");
	Looplink *q=L->next;
	while(q !=L)
	{
		printf("%d\t",q->data);
		q=q->next;
	}
	printf("\n");

}

尾删法

//尾删
int list_delete_tail(Looplink *L)
{
	if(NULL == L || list_empty(L))
	{
		printf("尾删失败\n");
			return -1;
	}

	Looplink *p=L;
	while(p->next->next != L)
	{
       p=p->next;

	}
	free(p->next);
	p->next=L;

	L->len--;
	printf("删除成功\n");
	return 0;
}

删除头结点

//删头结点
Looplink *kill_head(Looplink *L)
{

	if(NULL ==L || list_empty(L))
	{
		printf("删除失败\n");
		return NULL;
	}
	//遍历到最后一个
	Looplink *q=L->next;
	while(q->next != L)
	{
		q=q->next;
	}
	//孤立头
	q->next=L->next;
	//删头结点
	free(L);
	L=NULL;
    printf("删头成功\n");
	//返回第一个结点的地址
	return q->next;
}

删除头结点的遍历

//删头后的遍历
void list_show2(Looplink *S)
{
	if(NULL == S)
	{
		printf("遍历失败\n");
		return;
	}

	printf("删头后:");
	Looplink *q=S;
	do
	{
         printf("%d\t",q->data);
		 q=q->next;
	}while(q!=S);

	printf("\n");
}

代码运行图

 

  • 4
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值