|
10个人,然后数到第5个出局,程序得出的结果是第一个数数到5,然后出局,而之后的数都是数到4就出局,这里有点不明白程序错在哪里,该怎么改。 #include <stdlib.h>
#include<stdio.h>
struct node{
int data;
struct node *next;
}node,*list,*p,*r;
void JOSEPHU(int n,int m)
{
int i,j;
list=NULL;
for(i=1;i<=n;i++)
{
p=(struct node*)malloc(sizeof(node));
p->data=i;
if(list==NULL)
list=p;
else
r->next=p;
r=p;
}
p->next=list; /*建立一个循环链表*/
p=list;
for(i=1;i<=n;i++)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n"); /*打印链表,并检查循环链表是不输入正确*/
for(i=1;i<n;i++)
{
for(j=1;j<m;j++)
{
r=p;
p=p->next;
}
printf("出局人:%d\n",p->data);
r->next=p->next;
}
}
void main()
{
int x, z;
printf("请输入总人数:");
scanf("%d",&x);
printf("请输入密码:");
scanf("%d",&z);
JOSEPHU(x,z);
}
|
|
| 20分 |
修改如下:
void JOSEPHU(int n, int m)
{
int i, j;
list = NULL;
for (i = 1; i <= n; i++)
{
p = (struct node*)malloc(sizeof(node));
p->data = i;
if (list == NULL)
list = p;
else
r->next = p;
r = p;
}
p->next = list; /*建立一个循环链表*/
p = list;
for (i = 1; i <= n; i++)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n"); /*打印链表,并检查循环链表是不输入正确*/
for (i = 1; i<n; i++)
{
for (j = 1; j<m; j++)
{
r = p;
p = p->next;
}
printf("出局人:%d\n", p->data);
r->next = p->next;
p = p->next; //加一句
}
}
|
|
代码有内存泄露的问题,值得注意
|
|
