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

目录

约瑟夫环的图片解释

约瑟夫环的代码实现

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

创建循环链表

判空

 尾插

带头结点的遍历

尾删法

删除头结点

删除头结点的遍历


约瑟夫环的图片解释

 

数据结构之约瑟夫环(循环链表实现)_第1张图片

约瑟夫环的代码实现

//约瑟夫环
int list_huan(Looplink *S,int n,int m)
{
	Looplink *p=S;
	printf("约瑟夫环实现后:");
	for(int j=0;jnext;
		}
		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");
}

代码运行图

数据结构之约瑟夫环(循环链表实现)_第2张图片

 

你可能感兴趣的:(数据结构,链表,java)