前端之家收集整理的这篇文章主要介绍了
【数据结构】 循环单链表 约瑟夫回环问题,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
#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");
}