2024级超星程设C语言,单链表存储法雷序列,实验09动态数据组织

题目编号 :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上可能能发现,给同学们分享一下。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值