栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

目录

约瑟夫环的图片解释

约瑟夫环的代码实现

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

创建循环链表

判空

 尾插

带头结点的遍历

尾删法

删除头结点

删除头结点的遍历


约瑟夫环的图片解释

 

约瑟夫环的代码实现
//约瑟夫环
int list_huan(Looplink *S,int n,int m)
{
	Looplink *p=S;
	printf("约瑟夫环实现后:");
	for(int j=0;jnext;
		}
		Looplink *q=p->next;
		printf("%dt",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("%dt",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("%dt",q->data);
		 q=q->next;
	}while(q!=S);

	printf("n");
}
代码运行图

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1022521.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号