Code Bye

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

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;     //加一句
	}
}
代码有内存泄露的问题,值得注意

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于循环链表解决约瑟夫环的问题