实验09动态数据组织(2023级)吉林大学高级语言程序设计作业

请同学们先看提示,自行思考实践后无果再看通过代码。学习不要欺骗自己!!!

欢迎校友+q3023225096进行讨论交流

6个功能一步到位,取消注释以启用功能

代码仅供参考

#include<stdio.h>
#include<stdlib.h>

int count = 0;

struct linklist			//创建结构体类型
{
	int data;
	int data2;
	struct linklist* next;
};  

//以下是函数声明部分

struct linklist* initial(void);		//链表初始化,包括了开头为0的错误情况

void printlist(struct linklist* plisthead);		//遍历打印链表

struct linklist* killrept(struct linklist* plisthead);		//删除重复项

struct linklist* getmid(struct linklist* plisthead);		//获取并返回链表中间节点地址

int gcdFarlei(int x, int r);		//返回法雷数列分子分母的最大公约数

struct linklist* creatFarlei(void);		//创建n阶法雷数列

struct linklist* sortFarlei(struct linklist* plisthead);		//递增排序法雷数列

void printFarlei(struct linklist* plisthead);		//遍历打印法雷数列,0/1,1/1单独输出

void backprint(struct linklist* plisthead);		//打印倒数第k个链表节点

struct linklist* sort(struct linklist* plisthead);		//递增排序链表

//以下是主函数部分,包括习题要求所有功能

int main()		
{	
	//printlist(initial());		//打印链表
	
	//printlist(killrept(initial()));		//打印删除重复项后的链表
	
	//printlist(getmid(initial()));		//打印中间及其后面的链表
	
	//printFarlei(sortFarlei(creatFarlei()));		//打印n阶法雷数列
	
	//backprint(initial());		//打印倒数第k个链表节点
	
	//printlist(sort(initial()));		//打印递增排序链表
	
	return 0;
}

//以下是函数定义部分

struct linklist* initial(void)		//链表初始化,包括了开头为0的错误情况
{
	struct linklist* plisthead = NULL, * ptemp = NULL, * pnewnode = NULL;
	plisthead = (struct linklist*)malloc(sizeof(struct linklist*));
	ptemp = plisthead;
	do
	{
		pnewnode = (struct linklist*)malloc(sizeof(struct linklist*));
		scanf("%d", &pnewnode->data);
		count++;
		ptemp->next = pnewnode;
		ptemp = pnewnode;
	} while (pnewnode->data != 0);
	count--;
	pnewnode->next = NULL;
	if ((plisthead->next)->data == 0)
	{
		printf("NULL");
		exit(0);
	}
	else
		return plisthead;
}

void printlist(struct linklist* plisthead)		//遍历打印链表
{
	int space = 0;
	for (plisthead = plisthead->next; plisthead->data != 0; plisthead = plisthead->next)
	{
		if (space == 1)
			printf(" %d", plisthead->data);
		if (space == 0)
		{
			printf("%d", plisthead->data);
			space = 1;
		}
	}
	return;
}

struct linklist* killrept(struct linklist* plisthead)		//删除重复项
{
	struct linklist* pi = NULL, * pj = NULL, * pij = NULL;
	for (pi = plisthead->next; pi->data != 0; pi = pi->next)
		for (pj = pi->next, pij = pi; pj->data != 0; )
		{
			if (pi->data == pj->data)
			{
				pij->next = pj->next;
				pj = pij->next;
			}
			else
			{
				pij = pj;
				pj = pj->next;
			}
		}
	return plisthead;
}

struct linklist* getmid(struct linklist* plisthead)		//获取并返回链表中间节点地址
{
	if (count % 2 != 0)
		for (int i = count / 2.0 + 0.5 - 1; i > 0; i--)
			plisthead = plisthead->next;
	if (count % 2 == 0)
		for (int i = count / 2 - 1; i > 0; i--)
			plisthead = plisthead->next;
	return plisthead;
}

int gcdFarlei(int x, int r)		//返回法雷数列分子分母的最大公约数
{
	return (r == 0) ? x : gcdFarlei(r, x % r);
}

struct linklist* creatFarlei(void)		//创建n阶法雷数列
{
	int x, y, n;
	scanf("%d", &n);
	if (n < 2)
	{
		if (n == 1) printf("0/1 1/1");
		else printf("NULL");
		exit(0);
	}
	else
	{
		struct linklist* plisthead, * pnewnode, * ptemp;
		plisthead = (struct linklist*)malloc(sizeof(struct linklist*));
		pnewnode = (struct linklist*)malloc(sizeof(struct linklist*));
		plisthead->next = pnewnode;
		for (y = 2; y <= n; y++)
			for (x = 1; x < y; x++)
				if (gcdFarlei(x, y % x) == 1)
				{
					pnewnode->data = x;
					pnewnode->data2 = y;
					ptemp = pnewnode;
					pnewnode = (struct linklist*)malloc(sizeof(struct linklist*));
					ptemp->next = pnewnode;
				}
		pnewnode->data = 0;
		return plisthead;
	}
}

struct linklist* sortFarlei(struct linklist* plisthead)		//递增排序法雷数列
{
	int flag = 1;
	struct linklist* pi = NULL, * pj = NULL, * pi0;
	while (flag == 1)
		for (flag = 0, pi0 = plisthead, pi = pi0->next, pj = pi->next; pj->data != 0; pi0 = pi, pi = pj, pj = pj->next)
			if ((double)pi->data / pi->data2 > (double)pj->data / pj->data2)
			{
				pi0->next = pj;
				pi->next = pj->next;
				pj->next = pi;
				flag = 1;
			}
	return plisthead;
}

void printFarlei(struct linklist* plisthead)		//遍历打印法雷数列,0/1,1/1单独输出
{
	printf("0/1 ");
	for (plisthead = plisthead->next; plisthead->data != 0; plisthead = plisthead->next)
		printf("%d/%d ", plisthead->data, plisthead->data2);
	printf("1/1");
	return;
}

void backprint(struct linklist* plisthead)		//打印倒数第k个链表节点
{
	int k = 0;
	scanf("%d", &k);
	if (k > count)
	{
		printf("NULL");
		return;
	}
	plisthead = plisthead->next;
	for (int i = count - k; i > 0; i--)
		plisthead = plisthead->next;
	printf("%d", plisthead->data);
}

struct linklist* sort(struct linklist* plisthead)		//递增排序链表
{
	int temp, flag = 1;
	struct linklist* pi = NULL, * pj = NULL;
	while (flag == 1)
		for (flag = 0, pi = plisthead->next, pj = pi->next; pj->data != 0; pi = pi->next, pj = pi->next)
			if (pi->data > pj->data)
			{
				temp = pi->data;
				pi->data = pj->data;
				pj->data = temp;
				flag = 1;
			}
	return plisthead;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值