题目编号 :Exp09-Basic05,GJBook3例-13-04
题目名称:单链表存储法雷序列
题目描述:请填写缺失代码完成程序,实现如下功能:
给定一个正整数n,用单链表递增存储n阶法雷序列各项值。n阶法雷序列是把所有不可约分的分数j/i(0<i≤n; 0≤j≤i)递增排序的序列。
输入一个正整数n;输出n阶法雷序列各项分数形式,分数的分子和分母间以/连接,各个分数间以一个西文空格间隔,最后一个数字后无任何字符。若是空链表或n不符合要求,则输出NULL。
例如,
输入:3
输出:0/1 1/3 1/2 2/3 1/1
***注意***:
提交答案时,需粘贴完整的源代码,仅粘贴填空处的代码将被判错。
笔者:超星的练习是填空题,不能按自己思路创建函数(估计oj也差不多),还是有点烦的
#include <stdio.h>
#include <malloc.h>
struct farlei_item {
int numerator, denominator; // 分子、分母
struct farlei_item* next; // 连接部分
};
typedef struct farlei_item* farleipointer;
int gcd(int x, int y) { /* 求最大公约数 */
int i, min;
if (x > y)
min = y;
else
min = x;
for (i = min;i >= 1;i = i + 0) {
if (x % i == 0 && y % i == 0) break;
i--;
}
return i;
}
/*构造法雷序列,并返回序列头指针*/
farleipointer farlei(int n) {
int i, j;
farleipointer fn, r, r0, p;
fn = r = r0 = p = NULL;
if (n < 1) return NULL; //如果n<=0,则没有法雷序列
fn = (farleipointer)malloc(sizeof(struct farlei_item)); //构造0/1
fn->numerator = 0;
fn->denominator = 1;
p = (farleipointer)malloc(sizeof(struct farlei_item)); //构造1/1
p->numerator = 1;
p->denominator = 1;
fn->next = p;
p->next = NULL;
r = fn;
for (int index = 1;index < n;index++) {
for (int jndex = index + 1;jndex <= n;jndex++) {
i = index;
j = jndex;
int gcnum = gcd(i, j);
i = i / gcnum;
j = j / gcnum;
farleipointer r2 = (farleipointer)malloc(sizeof(struct farlei_item));
r2->numerator = i;
r2->denominator = j;
r2->next = NULL;
farleipointer temp = fn;
farleipointer tempnex=fn;
while ((temp->numerator) * j < (temp->denominator) * i) {
tempnex = temp;
temp = temp->next;
}
if ((temp->numerator) * j <= (temp->denominator) * i) {
free(r2);
r2 = NULL;
}
else {
tempnex->next = r2;
r2->next = temp;
}
}
}
return fn;
}
void print(farleipointer fn) {//输出fn引导的法雷序列
farleipointer p_moving = fn;
printf("%d/%d", p_moving->numerator, p_moving->denominator);
while (p_moving != NULL) {
p_moving = p_moving->next;
if (p_moving != NULL) printf(" %d/%d", p_moving->numerator, p_moving->denominator);
else break;
}
}
void release(farleipointer head) {//释放单链表空间,head是单链表首结点指针
if (head == NULL) return;
farleipointer mov = head;
farleipointer prv = head;
while (mov != NULL) {
prv = mov->next;
free(mov);
mov = NULL;
mov = prv;
}
}
int main(void) {
int n;
farleipointer fn;
scanf("%d", &n);
fn = farlei(n); //生成n级法雷序列
if (fn != NULL)
print(fn);
else
printf("NULL");
release(fn);
return 0;
}
这里求最大公因数的算法非常不好,不过做题够用了,但我还是我先看看吧,读完大学肯定得用的。然后codeblocks上检查不出来的问题,复制到visual studio 2022上可能能发现,给同学们分享一下。