当前位置: 代码迷 >> C语言 >> 希望jzh2004大哥再进来帮我修改一下!!谢谢,急!麻烦了
  详细解决方案

希望jzh2004大哥再进来帮我修改一下!!谢谢,急!麻烦了

热度:419   发布时间:2004-06-09 23:06:00.0
希望jzh2004大哥再进来帮我修改一下!!谢谢,急!麻烦了

题目是:

有N个小孩子,按顺时针方向围成一个圆。老师指定从第一个小孩开始报数,按顺序1,2,3…… 数到M个小孩时,该小孩子退到圈外,然后从编号为M的下一个小孩子开始报数。如此重复下去,直到所有小孩都出列,求小孩的出列顺序。 1.用链表处理 2.N和M用键盘输入。 3.分别用3个函数创建一个链表的求解。完成的求解用链表输出小孩的出列顺序。 4.在主函数中调用上面的函数。

这是我做的,但是有好多的错误。 我不知道要怎么修改呀!!麻烦大哥帮忙看下!!

#include <stdio.h> #include <malloc.h> #include <conio.h> typedef struct node_type{ int seq,code; struct node_type *next; }link; main() { int i,m,n,cn; link *h,*p,*q; printf("Input the first code m:"); scanf("%d",&m);//输入初始数 printf("Input number n:"); scanf("%d",&n);//输入人数 m=m-1;//此处减一是相当于... p=(link*)malloc(sizeof(link)); h=p; q=p; printf("Input codes:"); for(i=1;i<=n-1;i++) { scanf("%d",&cn); p->seq=i;p->code=cn; p=(link*)malloc(sizeof(link)); q->next=p; q=p; } scanf("%d",&cn); p->seq=n; p->code=cn; p->next=h; if((n>1)&&(m==0)) { m=h->code;printf("%d ",h->seq); p->next=h->next; free(h); h=p->next; } p=h; while((n>1)&&(m!=0)) { if(m>1) for(i=1;i<=m-1;i++)p=p->next; q=p->next; m=q->code; printf("%d ",q->seq); p->next=q->next; free(q); n=n-1; } printf("%d\n",p->seq); getch(); }

急呀!!谢谢咯!!!

[此贴子已经被作者于2004-06-14 22:09:41编辑过]

搜索更多相关的解决方案: 麻烦  

----------------解决方案--------------------------------------------------------

你把编译的错误说明也贴出来,最好你说一下错在哪?

我在网吧没编译器


----------------解决方案--------------------------------------------------------

这题目我感觉太复杂啦!! 自己仔细想象好象都不对呀!!


----------------解决方案--------------------------------------------------------

题目叫你要写三个函数啊,你定义好链表后一个个来,先写个建链表函数

在写报数的函数,在写输出的函数,然后主函数调用

这样你会思路清楚点的


----------------解决方案--------------------------------------------------------
写报数的函数这里我的思路不是很清晰!!
----------------解决方案--------------------------------------------------------

写报数函数就是一个反复循环的过程,一开始循环链表从第一个开始报

当报到M时,就删除该结点,(这应该会)

直到只剩一个为止

定义一个m,从1开始到m就删除结点,并将m复位为1


----------------解决方案--------------------------------------------------------

能不能帮我把这个函数给我写一下呀!!

[此贴子已经被作者于2004-06-10 20:36:36编辑过]


----------------解决方案--------------------------------------------------------

void f(link *h,int m)

{ int i=1;

link *p

while(1)

{ if(h->next==h)return; /*如果链表只剩一个结点,就退出*/

if(i+1==m) /*如果下一个结点报到了m*/

{ p=h->next;h->next=p->next;free(p);i=1;h=h->next;} /*将该结点删除*/

else {h=h->next;i++;}

}

}


----------------解决方案--------------------------------------------------------

谢谢大哥啦!!我自己再写写,有不懂的还要向你请教啊!!


----------------解决方案--------------------------------------------------------

   我自己也马马乎乎的凑合的写出来了,但自己觉得不是很满意,不知道jzh2004大哥有没有时间呀.

能不能把这个题目用你的思想来完整写一下,我想拿和我自己写的做一些对比,看看存在的一些不足的地方,

随便想看一下算法上的不同.

拜托了!!jzh2004大哥!!!!


----------------解决方案--------------------------------------------------------
  相关解决方案