加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 06:30:52 所属栏目:安全 来源:网络整理
导读:#includestdio.h#includestdlib.htypedef struct data{ //定义一个结构体“data” int num; //用于存放人的序号 int val; //用于存放密码 }typedata; typedef struct node{ //定义一个结构体(结点),其中包含一个数据域和一个指针域 typedata data; //结构
#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:%dtval:%dn",p->data.num,p->data.val); //输出 
		m=p->data.val; //取得输出结点的密码 
		free(p); 
	}

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读