约瑟夫环(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
有代码还写不出个算法框图?

约瑟夫环问题怎么解决啊?请用C语言写代码,谢谢!
程序可以运行的

数据结构中的约瑟夫环问题用C语言怎么编写出来啊?
1. 程序分析:这是一个比较经典的算法--约瑟夫环问题.2.个人分析: 算法比较经典,对于这样的问题本应该使用链表的形式会比较容易.约瑟夫环算法 则体现了使用数组来完成链表该完成的功能,虽然形式上完全不相同,但却求出了 相同的结果.有异曲同工之妙.总之我个人认为是数组中非常经典的算法了.希望本 ...

求助, 约瑟夫环问题(C语言)
修改后的版本,解决初始m为1的情况。include<stdio.h> include<malloc.h> typedef struct node{ int num;int val;struct node* next;}listnode;\/\/两个结构体可以合并以减少程序复杂度 typedef listnode* linklist;int main(){ int n,i,b,m,j;linklist q=(listnode*)malloc(sizeof(listnode))...

求c语言用循环链表编写约瑟夫环代码(速度求解)!!!
include "stdlib.h"define S sizeof(struct node)struct node { int num;struct node *next;};typedef struct node NODE;NODE *createlinklist(int n){ NODE *head,*p,*q;int i=1;head=p=(struct node*)malloc(sizeof(struct node));p->num=i;for(i=2;i<=n;i++){ q=(struct no...

求用循环队列解决约瑟夫环问题的C语言代码,急,速度!!!
void main(){ int a, b, c;\/\/t i, j, k;\/\/t aa[100], b[100];cout<<"请输入总人数:";cin>>a;cout<<endl<<"请输入开始位子:";cin>>b;cout<<endl<<"请输入步长:";cin>>c;Fmade(a, b, c);} void Fmade(int x, int y, int z){ int i, j=0, k=0;int aa...

求看下这个用C语言写的约瑟夫环代码错在哪儿
void del_Joseph(Joseph*current_p,Joseph *pre_p)这个函数去掉参数列表,直接用全局变量就行,不去掉反而会错。因为,当他们作为参数传递时,本身的值是不能被改变的。而你在函数中释放掉current_p所指向的空间,但current_p仍指向该空间,导致后面出错。发现这个问题,只要你打印下每次删除的值就行了...

C语言编程:有n个人围成一圈,按顺序从1到n编号。从第一个人开始,报到3...
int i,j=0,k=0,n;int a[30]={0};printf("请输入有几个人玩游戏:");scanf("%d",&n);for(i=0;i<n;i++){ a=1;\/\/1代表活着,0代表出局 } for(i=1;i<4;i=i%3+1)\/\/控制i的值在[0,3]{ if(3==i&&a[j]!=0){ a[j]=0;printf("%d号玩家出局\\n",j+1);k++;...

求数据结构(C语言版)题集实习题答案
node[n+i].lchild=x1;buff_node[n+i].rchild=x2;} for (i=0;i<n;i++){ cd.start=n;c=i;p=huff_node[c].parent;while(p!=0){ if (huff_node[p].lchild==c)cd.bits[cd.start]=0;else cd.bits[cd.start]=1;cd.start=cd.start-1;c=p;p=huff_node[p].parent;} ...

相似回答