【数据结构】 循环单链表 约瑟夫回环问题

前端之家收集整理的这篇文章主要介绍了【数据结构】 循环单链表 约瑟夫回环问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
#include<stdio.h>
#include<stdlib.h>

typedef struct data
{ 
	//定义一个结构体“data” 
	int num; //用于存放人的序号 
	int val; //用于存放密码 
}typedata; 

typedef struct node
{ 
	//定义一个结构体(结点),其中包含一个数据域和一个指针域 
	typedata data; //结构体的嵌套 
	struct node *next; 
}listnode; 

typedef listnode *linklist; 
linklist head;

void main()// 进入主函数 
{ 
	int n,i,b,m,j; 
	linklist head=(listnode *)malloc(sizeof(listnode)); //申请一个空间(头结点 head) 
	listnode *p,*q; //定义两个可以指向结点的指针 
	printf("输入总人数:"); 
	scanf("%d",&n); 
	q=head; //用指针q指向头结点 

	for(j=1;j<=n;j++) //本次循环主要是将每一个人的数据(包括序号、密码)存入循环链表中 
	{ 
		printf("请输入第%d号同学的密码:\n",j); 
		scanf("%d",&b); 
		printf("\n"); 
		q->next=(listnode *)malloc(sizeof(listnode)); 
		//将头结点的next域指向刚生成的一个结点 
		q=q->next; 
		q->data.val=b; //输入密码 
		q->data.num=j; //输入序号 
		q->next=head->next; 
	} 

	//将尾结点的next域指向第一个结点,构成循环链表 
	printf("请任意输入一个数m:"); 
	scanf("%d",&m); 

	if(m<=0) printf("输入错误"); 

	do
	{
		i=1; 

		while(i!=m)
		{ 
			//将q指针指向所要输出的结点的前一结点 
			q=q->next; 
			i++; 
		} 
		p=q->next; //p指向输出结点 
		q->next=p->next; //将输出结点的前结点的next域指向输出结点的后结点 
		printf("num:%d\tval:%d\n",p->data.num,p->data.val); //输出 
		m=p->data.val; //取得输出结点的密码 
		free(p); 
	}

	while(q->next!=q); //只剩最后一个结点时结束 

	printf("num:%d\tval:%d\n",q->data.num,q->data.val); //输出最后一个结点 

	free(q); //释放最后一个结点 
	free(head); //释放头结点 

	printf("约瑟夫环结束,欢迎下次光临~·~\n"); 
} 

猜你在找的数据结构相关文章