作业帮 > 综合 > 作业

C语言 约瑟夫环问题:用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出.

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/11/07 21:08:26
C语言 约瑟夫环问题:用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出.
高手帮看看我编的有问题没.最后释放那对吗?在网上看了好些关于这个问题的程序,代码都比较长.(一开始想用数组编,后来发现用数组的话不能定义变长度的数组,有什么方法可以解决.)
#include
#include
struct number
{
\x05int num;
\x05struct number * next;
};
void main ()
{
\x05int m,n;
\x05struct number * p,* head=NULL,* tail;
\x05printf("please input M and N:\n");
\x05scanf("%d %d",&m,&n);\x05\x05 //输入M、N值.
\x05for (int i=1; inum=i;
\x05\x05if(head==NULL)
\x05\x05\x05head=p;
\x05\x05else
\x05\x05\x05tail->next=p;
\x05\x05tail=p;
\x05}
\x05tail->next=head;
\x05
\x05for(i=1; inum = 0)
\x05\x05\x05\x05j++;\x05\x05\x05
\x05\x05}
\x05\x05printf("%d ",p->num);
\x05\x05p->num = 0; //将值输出后置0,下次数数跳过.
\x05}
\x05printf("\n");
\x05p=head; //释放所有节点.
\x05for(i=1; inext;
\x05}
}
最后应该是
//释放所有节点.
\x05for(i=1; inext;
\x05\x05free(p);
\x05}
帮你改了程序
#include
#include
struct number
{
\x09int num;
\x09struct number * next;
};
void main ()
{
\x09int m, n;
\x09struct number * p, * head=NULL, * tail;
\x09printf("please input M and N:\n");
\x09scanf("%d %d", &m, &n);\x09\x09 //输入M、N值.
\x09for (int i=1; inum=i;
\x09\x09if(head==NULL){
\x09\x09\x09head=p;
tail=p;//注意开始tail也要赋值
}
\x09\x09else
\x09\x09\x09tail->next=p;
\x09\x09tail=p;
\x09}
\x09tail->next=head;
\x09p = tail; //从head开始,记录开始的前一个指针
\x09while(n--) //剩下的数的个数为n\x09\x09\x09\x09\x09
\x09{ int t = m%n; //防止多数太多圈造成时间浪费
\x09\x09for(int j=1; jnext;
number *q = p->next; //要删的数的指针
\x09\x09printf("%d ", q->num); //输出要删的数
\x09\x09p->next = q->next; //要删的数从链表中去掉
free(q);
\x09}
\x09printf("\n");
}