题目是:
有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大哥!!!!
----------------解决方案--------------------------------------------------------