主题:[讨论]关于约瑟夫环的问题
大家好,最近有作业要写关于约瑟夫环的问题,我写完后编译通过,但运行程序时输入人数和每个人的密码后提示段错误,不知怎么回事儿,请大家指点下。
以下是问题的描述:
约瑟夫问题的一种描述是:编号为1,2,……,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。
以下是我写的关于这个问题的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode0{
int num; //储存每个人的编号
int passwd; //储存每个人的密码
}LNode0;
typedef struct LNode{
LNode0 data;
struct LNode *next;
}LNode;
void CreatList(LNode *person, int num, int passwd); //构造链表并给每人赋密码
void PrintList(LNode *person, int num, int passwd); //进行游戏并打印结果
main(){
int i, number, password;
LNode *person;
printf("Please enter the number of people and the first passwd:");
scanf("%d %d", &number, &password);
CreatList(person, number, password);
PrintList(person, number, password);
}
void CreatList(LNode *person, int num, int passwd){
//构造链表并给每人赋密码
LNode *p;
int i;
person = (LNode *) malloc(num * sizeof(LNode));
if (person == NULL){
printf("No enough memory!\n");
exit(0);
}
p = person;
printf("Please enter the password of each person(password <= %d):\n", passwd);
for (i = 0; i < num; i++){
p->data.num = i + 1;
scanf("%d", p->data.passwd);
if (p->data.passwd > passwd || p->data.passwd < 0){
printf("Input fault password! Please input again!\n");
i--;
}
else
{
p = p->next;
}
}
p->next = person;
}
void PrintList(LNode *person, int num, int passwd){
//进行游戏并打印结果
LNode *p; //保存出局的人前一个人的节点
int i; //计数器
p = person + passwd - 1;
printf("Game results are:\n");
printf("%d\t", (p+1)->data.num);
p->next = p->next->next;
passwd = p->next->data.passwd; //第一个出局的人的密码
free(p + 1);
for (i = 1; i <= num; i++){
p = p + passwd;
printf("%d\t", (p+1)->data.num);
p->next = p->next->next;
passwd = p->next->data.passwd;
free(p + 1);
}
}
以下是问题的描述:
约瑟夫问题的一种描述是:编号为1,2,……,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。
以下是我写的关于这个问题的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode0{
int num; //储存每个人的编号
int passwd; //储存每个人的密码
}LNode0;
typedef struct LNode{
LNode0 data;
struct LNode *next;
}LNode;
void CreatList(LNode *person, int num, int passwd); //构造链表并给每人赋密码
void PrintList(LNode *person, int num, int passwd); //进行游戏并打印结果
main(){
int i, number, password;
LNode *person;
printf("Please enter the number of people and the first passwd:");
scanf("%d %d", &number, &password);
CreatList(person, number, password);
PrintList(person, number, password);
}
void CreatList(LNode *person, int num, int passwd){
//构造链表并给每人赋密码
LNode *p;
int i;
person = (LNode *) malloc(num * sizeof(LNode));
if (person == NULL){
printf("No enough memory!\n");
exit(0);
}
p = person;
printf("Please enter the password of each person(password <= %d):\n", passwd);
for (i = 0; i < num; i++){
p->data.num = i + 1;
scanf("%d", p->data.passwd);
if (p->data.passwd > passwd || p->data.passwd < 0){
printf("Input fault password! Please input again!\n");
i--;
}
else
{
p = p->next;
}
}
p->next = person;
}
void PrintList(LNode *person, int num, int passwd){
//进行游戏并打印结果
LNode *p; //保存出局的人前一个人的节点
int i; //计数器
p = person + passwd - 1;
printf("Game results are:\n");
printf("%d\t", (p+1)->data.num);
p->next = p->next->next;
passwd = p->next->data.passwd; //第一个出局的人的密码
free(p + 1);
for (i = 1; i <= num; i++){
p = p + passwd;
printf("%d\t", (p+1)->data.num);
p->next = p->next->next;
passwd = p->next->data.passwd;
free(p + 1);
}
}