永发信息网

一个数据结构的问题

答案:2  悬赏:80  手机版
解决时间 2021-07-19 20:02
  • 提问者网友:寂寞撕碎了回忆
  • 2021-07-19 08:29
n个人围成一个圆圈,首先第一个人从一开始一个人一个人的顺时针报数,报到第m个人,令其出列。然后再从下一个人开始,从顺时针报数,报到第m个人,再令其出列,···,如此下去,直到圆圈中只剩一个人为止。此人即为优胜者。(基于静态链表)
最佳答案
  • 五星知识达人网友:woshuo
  • 2021-07-19 09:08

#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;
}

全部回答
  • 1楼网友:愁杀梦里人
  • 2021-07-19 10:19
就是约瑟夫问题呗 #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); }
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯