永发信息网

一个数据结构的问题

答案:2  悬赏:80  手机版
解决时间 2021-07-19 20:02
n个人围成一个圆圈,首先第一个人从一开始一个人一个人的顺时针报数,报到第m个人,令其出列。然后再从下一个人开始,从顺时针报数,报到第m个人,再令其出列,···,如此下去,直到圆圈中只剩一个人为止。此人即为优胜者。(基于静态链表)
最佳答案

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>


#define OK 1
#define ERROR 0


typedef struct node
{
int num;
struct node *next;
}Node , * LinkList;


void InitList(LinkList *L); //初始化函数
void CreateList(LinkList L,int n);//创建链表函数
void YsfList(LinkList L); //约瑟夫问题


int main()
{
LinkList L;
int n = 0;
InitList(&L);
printf("\n请输入人数:");
scanf("%d",&n);
CreateList(L,n);
YsfList(L);
return 0;
}


void InitList(LinkList *L)
{
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = (*L); //头指针初始化
}


void YsfList(LinkList L)
{
Node * p ,* q ,* pre;
int m,i = 0;
printf("\n请输入m的值: m = ");
scanf("%d",&m);
p = L;
while(p->next != p)
{
pre = p; //pre记录p的前驱以便删除p
p = p->next;
if(p == L) //头结点不能计数
{
pre = p;
p = p->next;
}
i ++;
if(i == m) //退出条件
{
printf("%d ",p->num);
pre->next = p->next; //删除退出结点
q = p;
free(q);
p = pre;
i = 0; //计数还原,从新计数
}
}
printf("\n\n\t\t 结束! \n");
}


void CreateList(LinkList L,int n)
{
Node * r, * s;
int i = 0;
r = L;
while(i < n)
{
s = (LinkList) malloc (sizeof(Node));
s->num = i + 1;
r->next = s; //尾插法创建链表
r = s;
i++;
}
r->next = L;
}

全部回答
就是约瑟夫问题呗 #include<stdio.h> #include<stdlib.h> typedef struct node { int m,h; struct node *next; }node,*linklist; linklist createform() { linklist L; node *r,*s; int flag=1,i=1,c; L=(node*)malloc(sizeof(node)); L->next=NULL; r=L; printf("请输入第%d个人的密码",i); scanf("%d",&c); if(c!=0) { L->m=c; L->h=i; } i=2; while(flag) { printf("请输入第%d个人的密码",i); scanf("%d",&c); if(c!=0) { s=(node*)malloc(sizeof(node)); s->m=c; s->h=i; r->next=s; r=s; i++; } else { flag=0; r->next=L; } } return L; } void outline(linklist L) { int a,data,flag=1; node *r,*s; printf("输入起始密码"); scanf("%d",&data); data=data-1; r=L; while(r->next!=NULL) { for(a=1;a<data;a++) { r=r->next; } s=r->next; r->next=s->next; data=s->m; printf(" 第%d个人的密码 %d \n",s->h,s->m); free(s); } } main() { linklist l; l=createform(); outline(l); }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
听雨的诗句语录,急!求一篇以古诗词或名言警
GTA4 DLC的 关系问题
Dnf公会怎样创建?
“茜”字用日语怎么读?
还要走多久是什么歌曲,雨露计划申请提交后多
麦蒂和主教练吵架吗?
如果你喜欢上了你好朋友的妹妹
怎样才能省钱买菜?
微吼音频效果和视频质量怎么样?有没有使用过
毕业论文评审教师评语,毕业论文(设计)指导
为什么打开留言板前两页空白?要下几页才能显
真心求许嵩《两种悲剧》歌词
ht6809适用手机QQ版本
是上班好啊还是做生意好啊!
怎样的挂更干脆?
推荐资讯
我的电脑这有是怎么回事啊
用牙膏擦豆豆有用吗
硬币大小的电池是什么型号。
一直点做匀变速运动,依次经过a,c,b三点,其中c
魔道学者怎么加技能
谁推荐一些好玩的游戏啊?
如何区别手机好坏
哈尔滨旅行社哪招导游
中国的医学发展到了什么程度?
魔兵传奇第二部漫画下载
推荐几首浪漫好听的歌曲
这样减肥行吗?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?