关于循环链表的问题,解决约瑟夫环

伊诗塔 发布于 2012/09/05 12:04
阅读 612
收藏 0

Serverless 架构就不要服务器了?>>>

这个代码每次我输入完名字之后就运行不了了,大家帮我解决解决 谢谢;我用的C语言。

/*有N个小孩围成一圈,

给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,

然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,

直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。*/

#include "stdio.h"

#include "malloc.h"

#include "string.h"

 

struct student

{

char name[20];

};

 

typedef struct node

{

struct student data;//数据域

struct node *next;//指针域

}*LinkList;

 

 

void shuchu(int n,int w,int s)

{

LinkList p,q,L;

int i;

L=(LinkList)malloc(sizeof(struct node));

p=L;

for(i=1;i<=n-1;i++)

{

printf("please input the name\n");

scanf("%s",p->data.name);

p=p->next;

p=(LinkList)malloc(sizeof(struct node));

}

printf("please input the name\n");

scanf("%s",p->data.name);

p->next=L;

p=L;

i=1;

for(i=1;i<=w;i++)

{

q=p;

p=p->next;

}

while(p->next!=p)

{

for (i=1;i<=s;i++)

{

q=p;

p=p->next;

}

q->next=p->next;

printf("%s\n",p->data.name);

free(p);

p=q->next;

}

printf("%s\n",p->data.name);

}

void main()

{

int n,w,s;

printf("please input the number n w and s\n");

scanf("%d%d%d",&n,&w,&s);

shuchu(n,w,s);

}

加载中
0
魔方帅帅
魔方帅帅

肯定会崩溃。

for(i=1;i<=n-1;i++)

{

printf("please input the name\n");

     scanf("%s",p->data.name);

     p=p->next;

     p=(LinkList)malloc(sizeof(struct node));

}

没有真正的链起来。。修改成这样。

for(i=1;i<=n-1;i++)

{

printf("please input the name\n");

scanf("%s",p->data.name);

p->next = (LinkList)malloc(sizeof(struct node));;

p = p->next;

}

应该就可以了

魔方帅帅
魔方帅帅
回复 @伊诗塔 : 不客气,加油。
伊诗塔
伊诗塔
好好 是这样的 谢谢你、
伊诗塔
伊诗塔
好的 我试试、
0
billzheng
billzheng

作业吧?

把你的调式错误信息,哪里程序奔溃等信息贴上来我们才帮你。别人没有帮你做作业的道理。

伊诗塔
伊诗塔
我传了、呵呵,谢谢你的帮助
伊诗塔
伊诗塔
我后面有回答你的问题,不是作业、相信我、
0
伊诗塔
伊诗塔
不是作业,呵呵。就是我自己做题的,我大一。
伊诗塔
伊诗塔
我传了、 我是初学者 呵呵、诸多不懂、
伊诗塔
伊诗塔
回复 @billzheng : 我用的VC++6.0 等下,我把调试的图插在下面、
billzheng
billzheng
你用的是什么编译器,怎么进行调试。能够在调试状态让程序崩溃然后显示程序堆栈么?
0
晓寒
晓寒

你链表建的不对,在shushu方法里的第一个for循环里,当输入name后,执行p=p->next; 这时候p->next指针没有内容,下一行又直接p=(LinkList)malloc(sizeof(struct node)); 虽然分配了内存,但所有的结点的next指针都是没有内容的,你调调看。

另外,发代码最好用插入代码,这样代码格式好看一些。

晓寒
晓寒
回复 @伊诗塔 : 刚出去一会儿,问题已经解决了,挺好。那就多加一句,初学时要学会调试,特别是链表指针相关的,调着调着就明白指针怎么玩儿了。
伊诗塔
伊诗塔
呵呵 好的 我第一次用开源中国不懂 谢谢 我就是感觉p=p->next 不对 我是初学者 请问怎么改呢?? 可以帮我写写么?、 这不是作业 谢谢哈、
0
billzheng
billzheng

 你的程序好几个地方都有问题,先讲两个明显导致崩溃的地方

  p = p->next; 总有可能到链表的尾部,所以在最后一次赋值后,p == null

然后你调用p=p->next; 会导致程序崩溃因为p是空指针

for(i=1;i<=w;i++)
{
  q=p;
  p=p->next;
} 

最好改为

for(i=1;i<=w;i++)
{
  if (p->next == null) {  //检查指针状态
    break;
  }
  q=p;
  p=p->next;
} 

 

伊诗塔
伊诗塔
呵呵 谢谢你 、已经解决了、
返回顶部
顶部