约瑟夫问题,求助

看似疯癫 2012-10-14 11:03:24
应该是这里错了,Status Joseph(int m,int n,int k),但我找不出来
提示: data <无法读取内存>
next <无法读取内存>




#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define OVERFLOW 0
#define ERROR 0
#define OK 1
#define NULL 0
typedef int Status;
typedef int ElemType;
typedef struct Cnode
{
ElemType data;
struct Cnode *next;
}CNode;

CNode *joseph;
Status Create_clist(int n)
{
CNode *clist,*p,*q;
int i=0;
for(i=n;i>=1;i--)
{
if(!(p=(CNode*)malloc(sizeof(CNode))))
return OVERFLOW;
{
p->data=i;
p->next=clist;
clist=p; //创建链表
}
if(i==n)
q=p; //q指向链表最后结点
}
q->next=clist; //构成循环链表
joseph=clist;
return OK;
}
Status Joseph(int m,int n,int k)
{
CNode *clist,*p,*q;
int i;
if(m>n) return ERROR;
p=joseph;
for(i=1;i<=m;i++)
{
p=p->next;
q=q->next;
}
while(p)
{
for(i=1;i<=k;i++)
{
p=p->next;
q=q->next;
printf("%4d",q->data);
}
if(p->next==p) p=NULL;
else
{
p->next=q->next; //删除第k个结点
p=p->next; //使p指向第k+1个元素位置
free(q);
}
}
}
void main( )
{
int m,n,k;
CNode *clist;
clist=NULL;
printf("请输入n值:");
scanf("%d",&n);
printf("请输入m值:");
scanf("%d",&m);
printf("请输入k值:");
scanf("%d",&k);

Create_clist(n);

Joseph(m,n,k);


}



...全文
193 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
newtee 2012-10-15
  • 打赏
  • 举报
回复
就是按照约瑟夫环规则删除结点的意思
newtee 2012-10-15
  • 打赏
  • 举报
回复
看似疯癫 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

C/C++ code
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int a;
int b;
struct node *next;
}Lnode;
Lnode *creatlist(int n);
void printlist(Lnode *p);
void fun(Lnode *p,int n,i……
[/Quote] 这段代码运行结果为:全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========。还有想请问一下: printf("enter a,b:\n");
scanf ("%d,%d",&p->a,&p->b);, { printf("%3d",q->b);
q=q->next;
}
printf("%3d",p->b);。 printf("%3d",q->a);
m=q->b;
p->next=q->next; free(q);
q=p->next;
}
printf("%3d",p->a);这类代码的意思,谢谢!
赵4老师 2012-10-15
  • 打赏
  • 举报
回复
仅供参考
//假设有n个人团团围做,从第1个人开始数数,数到第m个人时候,第m个人出列,
//然后继续从1开始数数,数到第m个人退出
#include <stdio.h>
#include <conio.h>
int i,k,t;
int n,m;
static char f[1001];//0该座位未出圈,1该座位已出圈
void main() {
while (1) {
printf("Input n m(1000>=n>=m>=1):");
fflush(stdout);
rewind(stdin);
if (2==scanf("%d%d",&n,&m)) {
if (1000>=n && n>=m && m>=1) break;
}
}
t=0;//已出圈总人数
i=1;//座位编号
k=1;//当前要数的数
while (1) {
if (0==f[i]) {
if (m==k) {
t++;
f[i]=1;
printf("%3d ",i);
if (0==t%10) printf("\n");
if (t>=n) break;
}
k++;if (k>m) k=1;
}
i++;if (i>n) i=1;
}
cprintf("Press any key ...");
getch();
}
看似疯癫 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

a->b
等价于
(*a).b
等价于
a[0].b
[/Quote] 你能帮我改一下我写的代码吗?我实在是不会改了,运行老出错,如果可以的话,真的是万分感谢!
老友小明哥 2012-10-15
  • 打赏
  • 举报
回复
在Status Joseph(int m,int n,int k)中,你声明了CNode *clist,*p,*q;
但是q没有分配地址,是野指针。你却使用了q=q->next;
newtee 2012-10-15
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int a;
int b;
struct node *next;
}Lnode;
Lnode *creatlist(int n);
void printlist(Lnode *p);
void fun(Lnode *p,int n,int m);
main()
{
Lnode *p;
int n,m;
printf("input n and m:\n");
scanf("%d,%d",&n,&m);
p=creatlist(n);
printf("the list is:\n");
printlist(p);
printf("\nchu lie sunxu:\n");
fun(p,n,m);
}
Lnode *creatlist(int n)
{ int i;
Lnode *head,*p,*s;
head=( Lnode *) malloc(sizeof(Lnode ));
p=head;
head->next=p;
printf("enter a,b:\n");
scanf ("%d,%d",&p->a,&p->b);
for (i=2; i<=n; ++i )
{ s=(Lnode *) malloc(sizeof(Lnode ));
scanf ("%d,%d",&s->a,&s->b);
s->next=head;
p->next=s; p=s;
}
return (s);
}
void printlist(Lnode *p)
{ Lnode *q;
q=p->next;
while(q!=p)
{ printf("%3d",q->b);
q=q->next;
}
printf("%3d",p->b);
}
void fun(Lnode *p,int n,int m)
{ Lnode *q;
int i,count;
q=p;
for(i=1;i<n;i++)
{
count=0;
if(i!=1)
count++;
while(count!=m)
{
p=q;
q=q->next;
count++;
}
printf("%3d",q->a);
m=q->b;
p->next=q->next; free(q);
q=p->next;
}
printf("%3d",p->a);
}
赵4老师 2012-10-15
  • 打赏
  • 举报
回复
a->b
等价于
(*a).b
等价于
a[0].b
看似疯癫 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

n为人数 报到m的人出列 将他的密码作为新的m值
a是第几个人 b是他手里的密码
[/Quote] 请问一下,p->a,p->b是指什么?我这里有点混淆
看似疯癫 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

就是按照约瑟夫环规则删除结点的意思
[/Quote] 想问下,为什么我用你的代码在visual studio 2012 上运行不了?
赵4老师 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 3 楼 的回复:

仅供参考C/C++ code
//假设有n个人团团围做,从第1个人开始数数,数到第m个人时候,第m个人出列,
//然后继续从1开始数数,数到第m个人退出
#include <stdio.h>
#include <conio.h>
int i,k,t;
int n,m;
static char f[1001];//0该座位未出圈,1该座位已出圈
void……
[/Quote]
fflush(stdout);保证不带\n结尾的字符串输出到屏幕上。
rewind(stdin);清除之前可能输入的非法输入内容
输入格式不正确(即不是由空格或Tab字符或回车间隔的两个十进制数)时scanf不会返回2,
%3d让i占3个字符宽度输出,起到列对齐的作用。
看似疯癫 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

n为人数 报到m的人出列 将他的密码作为新的m值
a是第几个人 b是他手里的密码
[/Quote] 万分感谢!
看似疯癫 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

仅供参考C/C++ code
//假设有n个人团团围做,从第1个人开始数数,数到第m个人时候,第m个人出列,
//然后继续从1开始数数,数到第m个人退出
#include <stdio.h>
#include <conio.h>
int i,k,t;
int n,m;
static char f[1001];//0该座位未出圈,1该座位已出圈
void main() {
while (……
[/Quote] 请问:fflush(stdout);
rewind(stdin);
if (2==scanf("%d%d",&n,&m)) {
if (1000>=n && n>=m && m>=1) break;
},,的意思是,还有就是fflush(stdout);
rewind(stdin);的作用是。2==scanf("%d%d",&n,&m)这个格式我以前没见过
以及这段代码我不是很明白if (0==f[i]) {
if (m==k) {
t++;
f[i]=1;
printf("%3d ",i);这里为什么是%3d而不是%d?
谢谢!
newtee 2012-10-15
  • 打赏
  • 举报
回复
n为人数 报到m的人出列 将他的密码作为新的m值
a是第几个人 b是他手里的密码

64,661

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧