IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构--链表实现求多项式乘积 -> 正文阅读

[数据结构与算法]数据结构--链表实现求多项式乘积

数据结构–链表实现多项式求和&&求积

  • 首先,数据的组织形式:使用数组来存储结构体数据相对比较简单。但是为了熟悉链表的使用,这里使用链表。
  • 多项式的表示:输入的时候先输入系数,然后输入指数。输出同样是这样。

难点:

  • 求多项式乘积不像求和,因为后插入数据的指数可能比前一个数据要大,所以需要进行判断。
//链表实现一个多项式的相加和相乘
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>

typedef struct PolyNode* Polynomial;
struct PolyNode
{
	int coef;
	int expon;
	Polynomial link;
};
void attach(int c, int e, Polynomial* pRear)
{
	Polynomial P = (Polynomial)malloc(sizeof(struct PolyNode));
	P->coef = c;
	P->expon = e;
	P->link = NULL;
	(*pRear)->link = P;
	*pRear = P;
}
Polynomial readPoly()
{
	int num1 = 0, c = 0, e = 0;
	printf("请输入多项式的系数:");
	scanf("%d", &num1);
	Polynomial Head = (Polynomial)malloc(sizeof(struct PolyNode));     //构造一个空的头节点
	Polynomial Rear = Head;
	Head->link = NULL;
	while (num1--)
	{
		scanf("%d %d", &c, &e);
		attach(c, e, &Rear);
	}
	Polynomial T = Head;
	Head = Head->link;
	free(T);
	return Head;
}
int compare(int a, int b)
{
	if (a > b) return 1;
	else if (a == b) return 0;
	else return -1;
}
Polynomial polyAdd(Polynomial P1, Polynomial P2)
{
	Polynomial Head, Rear, T;
	Head = (Polynomial)malloc(sizeof(struct PolyNode));
	Head->link = NULL;
	Rear = Head;
	//比较指数大小,指数大的加入结果多项式,然后指针后移。
	int sum = 0;
	while (P1 && P2)
	{
		switch (compare(P1->expon, P2->expon))
		{
		case 1:
			attach(P1->coef, P1->expon, &Rear);
			P1 = P1->link;
			break;
		case 0:
			sum = P1->coef + P2->coef;
			if (sum) attach(sum, P1->expon, &Rear);
			P1 = P1->link; P2 = P2->link;
			break;
		case -1:
			attach(P2->coef, P2->expon, &Rear);
			P2 = P2->link;
			break;
		}
	}
	for (; P1; P1 = P1->link) attach(P1->coef, P1->expon, &Rear);
	for (; P2; P2 = P2->link) attach(P2->coef, P2->expon, &Rear);
	T = Head;
	Head = Head->link;
	free(T);
	return Head;
}
void printPoly(Polynomial P)
{
	int flag = 0;
	while (P)
	{
		if (flag)
		{
			printf(" ");
		}
		else
		{
			flag = 1;
		}
		printf("%d %d", P->coef, P->expon);
		P = P->link;
	}
}
Polynomial polyMulti(Polynomial P1, Polynomial P2)
{
	Polynomial T1, T2, Head, Rear, P;            //需要使用多项式首元素的指针,因此设置了T1,T2
	Head = (Polynomial)malloc(sizeof(struct PolyNode));
	Head->link = NULL;
	Rear = Head;
	T1 = P1;
	while (T1)
	{
		T2 = P2; Rear = Head;
		while (T2)
		{
			//进行排序插入
			int c = T1->coef * T2->coef;
			int e = T1->expon + T2->expon;
			while (Rear->link && Rear->link->expon > e)
			{
				Rear = Rear->link;
			}
			if (Rear->link && Rear->link->expon == e)
			{
				if (c + Rear->link->coef) Rear->link->coef = c + Rear->link->coef;
				else
				{
					Polynomial tmp = Rear->link;
					Rear->link = tmp->link;
					free(tmp);
				}
			}
			else
			{
				P = (Polynomial)malloc(sizeof(struct PolyNode));
				P->coef = c;
				P->expon = e;
				P->link = Rear->link;
				Rear->link = P;
				Rear = Rear->link;
			}
			T2 = T2->link;
		}
		T1 = T1->link;
	}
	Polynomial ttt = Head;
	Head = ttt->link;
	free(ttt);
	return Head;
}
int main()
{
	//输入多项式1 && 输入多项式2
	Polynomial P1 = readPoly();
	Polynomial P2 = readPoly();
	//计算多项式和并输出
	Polynomial P3 = polyAdd(P1, P2);
	printPoly(P3);
	//计算多项式乘积并输出
	Polynomial P4 = polyMulti(P1, P2);
	printf("\n");
	printPoly(P4);
	return 0;
}

结果如下

如求多项式:
3x4+5x2+6x1+2 和
5x20+7x4+3x 的乘积
在这里插入图片描述
和是:5x20+10x4+5x2+9x+2
乘积为:15x24+25x22+30x21+…

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-16 13:19:22  更:2022-01-16 13:21:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 19:29:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码