|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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);
复制代码
|
-
测试数据
-
我的垃圾结果
|