c语言编写约瑟夫环问题

#include<stdio.h>#include<stdlib.h>typedefstructnode{intkey;//密码intnum;//人的顺序intcount... #include <stdio.h>
#include <stdlib.h>

typedef struct node
{
int key; //密码
int num; //人的顺序
int count; //报数
struct node *next;
}node,*LinkList;

void CreatList(LinkList *p,int n)
{
int i;
int j=1;
LinkList q;
*p=(LinkList)malloc(sizeof(node));
q=*p;
printf("请输入每个人的密码:");
for(i=0;i<n-1;i++)
{
scanf("%d",&(*p)->key);
(*p)->num=j++;
(*p)->next=(LinkList)malloc(sizeof(node));
(*p)=((*p)->next);
}
q=(*p)->next;
scanf("%d",&(*p)->key);
(*p)->num=j++;
(*p)=q;
}

void DeleteNode(LinkList *p)
{
LinkList q;
q=((*p)->next);
if((*p)->key!=NULL)
{
(*p)->next=((*p)->next)->next;
printf("%d ",q->num);
}
else
{
printf("%d",(*p)->num);
}
free(q);
}

void Judge(LinkList *p,int *m)
{

int cot=1;
int i;
for(i=0;i<*m-1;i++)
{
(*p)->count=cot++;
(*p)=(*p)->next;
}
m=&((*p)->next)->key;
DeleteNode(&(*p)->next);
}

void main()
{
int m,n,i;
LinkList p;
printf("请输入初始上限:");
scanf("%d",&m);
printf("请输入人数:");
scanf("%d",&n);
for(i=0;i<n-1;i++)
{
CreatList(&p,n);
Judge(&p,&m);
}
}

程序总是在函数Judge那里崩坏,我看了断点发现(*p)里面具体的值都没有,是我建立链表的时候出了问题了吗?求调试
展开
 我来答
kaixingui2012
推荐于2016-07-08 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6427万
展开全部
改的略狠 ,自己研究一下吧
#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
int key;           //密码
int num;           //人的顺序
struct node *next;
}node,*LinkList;

void CreatList(LinkList *p,int n)
{
int i;
LinkList q;
*p=(LinkList)malloc(sizeof(node));
q=*p;
for(i=0;i<n-1;i++)
{
printf("请输入%d的密码: ", i+1);
scanf("%d",&q->key);
q->num=i+1;
q->next=(LinkList)malloc(sizeof(node));
q=q->next;
}
printf("请输入%d的密码: ", i+1);
scanf("%d",&q->key);
q->num=i+1;

q->next=*p;
}

void DeleteNode(LinkList *p, LinkList del )
{
LinkList q=*p ;
q->next=del->next; //保链
*p=q->next ; //指向下一个要数的节点
free(del); //释放出列节点
}

void Judge(LinkList *p,int m)
{
LinkList q=*p;
if ( q->next == q )
{
printf("%d\n",q->num);
}
else
{
int i;
for(i=0;i<m-1;i++)
{
*p=q; //上级节点
q=q->next ;
}
m=q->key ; //出列密码
printf("out %d\n", q->num ); //出列编号
DeleteNode( p, q ); //出列,释放结点并保持表的顺序
Judge(p,m); //继续检查下一个出列节点
}
}

void main()
{
int m,n;
LinkList p;
printf("请输入初始上限:");
scanf("%d",&m);
printf("请输入人数:");
scanf("%d",&n);

CreatList(&p,n); //创建表,只做一次
Judge(&p,m); //递归检查出列
}
追问
多谢啦,我自己换了个思路也解决了,来看看你的程序,多谢
追答
不客气,有问题共同研究
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式