马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 无敌太刀 于 2018-9-25 12:06 编辑 #include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
int number;
int data;
struct LNode *next;
}linklist;
linklist * init(int n)
{
linklist *L,*q;
L= (linklist*)malloc(sizeof(linklist));
printf("\n第1个人的密码是:");
L->number = 1;
scanf_s("%d", &L->data);
q = L; //输入第一个人的信息
for (int i = 2; i <= n; i++)
{
linklist *p;
p = (linklist*)malloc(sizeof(linklist));
printf("\n第%d个人的密码是:",i);
scanf_s("%d", &p->data);
p->number = i;
q->next = p;
p->next = L; //与头结点相连,构建循环
q = q->next;
} //输入所有剩下的信息
return L;
}
void fun(linklist *L, int m)
{
linklist *p=L, *q;
printf("出列顺序为:");
while (p->next != p)
{
for (int i = 1; i < m - 1; i++, p = p->next);
q = p->next;
printf("%d ", q->number);
p->next = q->next;
m = q->data; //重置报数上限
p = p->next;
free(q);
}
printf("%d", p->number); //只剩p时while跳出,需要单独将p输出
free(p);
}
void main()
{
int n, m;
printf("请输入共有多少人:");
scanf_s("%d", &n);
linklist *L=init(n);
printf("\n请输入最初的报数上限:");
scanf_s("%d", &m);
fun(L, m);
system("pause");
}
花了很长时间写(憋)出来一个尤瑟夫环代码,但是跑实验指导书上的测试数据结果不对(如图,最后两个数据结果颠倒了),本人拙见又看不出是哪里的问题······烦请大佬赐教
边界问题。因为这个不是传统的等数计数,加多一个判断式就好 m = q->data;
if (m != 1) //加这个
p = p->next;
free(q);
|