约瑟夫环(c语言版数据结构) 下面是约瑟夫环的代码,跪求大神帮忙写出代码对应的算法!越详细越好!

最好是把算法写成框图~~~最好快点很着急用!!
#include"stdio.h"
#include"malloc.h"
typedef int Datatype;
typedef struct node //定义单链表结点
{ Datatype code;
Datatype num;
struct node *next;
}Linklist;

Linklist *creatsclist(int x) //创建链表
{ Linklist *p,*q,*H; //定义指针
int i,code; //定义空间数据和常量i
i=1;
H=(Linklist *)malloc(sizeof(struct node));//开辟空间
H->next=NULL;
p=H;
while(i<=x)
{
printf("请输入第%d人的密码:",i);scanf("%d",&code);printf("\n");
q=(Linklist *)malloc(sizeof(struct node)); //开辟空间
q->code=code;
q->num=i;
q->next=NULL;
p->next=q;
p=q; i++;
}
q->next=H->next; //尾结点链接到头结点的下一结点
return H;
}

void printlist(Linklist *H,int x)
{ Linklist *p; int i=1;
p=H->next;
if(p!=NULL)
while(i<=x) //循环
{ printf("%d,%d\t",p->num,p->code);
p=p->next;
i++;
}
printf("\n\n");
}

void Joseph(Linklist *H)
{ Linklist *p,*q,*v; //创建循环链表
int m,k; k=0;
p=H->next; q=H; //p为头结点后的数据,q指向头结点
printf("请输入报数上限值:"); scanf("%d",&m); printf("\n");
while(p!=q)
{ k++;
if(k==m) //当k=m时,输出p所指的结点的序号及密码,并将该结点的code作为新的m值,再次循环
{ printf("%d\t",p->num);
m=p->code; k=1;
if(H->next==p) H->next=p->next;
q->next=p->next; //将p所指的结点删除
v=p;
p=q->next;
free(v);//释放v的空间
}
q=p;
p=p->next; //继续循环
}
printf("%d\t",p->num);
printf("\n");
}

void main()
{ Linklist *H;
int x;
printf("请输入总人数:"); scanf("%d",&x); printf("\n");
H=creatsclist(x);
printf("输出每个人的编号,密码:\n");
printlist(H,x);
printf("约瑟夫环问题结果输出:\n");
Joseph(H);
}

第1个回答  推荐于2017-09-17
#include <stdlib.h>
#include <stdio.h>
#include <Math.h>
typedef struct node
{int number;
int password;
struct node* next;
}Node,*Linklist;
Linklist CreateLinklist(int amount)
{int i;
Node *s=NULL,*r=NULL;
Linklist L=NULL,R=NULL;
for(i=0;i<amount;i++)
{
s=(Node*)malloc(sizeof(Node));
if(s==NULL)
{printf("空间申请失败!");
exit(0);
}
s->number=i+1;
s->password=rand()%10+1;
printf("%4d的密码%4d\n",s->number,s->password);
if(i==0)
{L=s;r=s;}
else {r->next=s;
r=s;
}
}
R=r;
r->next=L;
return(R);
}
void DeleteLinklist(Linklist R,int start,int amount,int num)
{Node *position=NULL,*p=NULL,*q=NULL;
int i,k,secret;
position=R;
secret=start;
for(i=num;i<=amount;i++)
{p=position;
for(k=1;k<secret;k++)
{p=p->next;}
q=p->next;
p->next=q->next;
secret=q->password;
printf("%5d",q->number);
if(i%10==0)
{printf("\n");}
position=p;
free(q);
}
}
int main()
{int amount,start,num;
Linklist R=NULL;
printf("\n请输入总人数:");
scanf("%d",&amount);
R=CreateLinklist(amount);
printf("\n请输入开始位置:");
scanf("%d",&start);
printf("\n请输入开始密码:");
scanf("%d",&num);
DeleteLinklist(R,start,amount,num);
return(1);
}本回答被提问者采纳
第2个回答  2013-03-27
有代码还写不出个算法框图?
相似回答