数据结构—稀疏多项式相加

    利用链表实现两个稀疏多项式相加。

代码

#include <iostream>
using namespace std;

// 定义多项式项结构体
typedef struct {
    int x;  // 系数
    int y;  // 指数
} Elemtype;

// 定义链表节点结构体
typedef struct Node {
    Elemtype data;
    struct Node* next;
} *LinkList, Node;

// 创建多项式链表,按照乱序输入顺序输出
void Great_LinkList(LinkList& L) {
    int n;
    Node* s, * pre, * p;
    cout << "请输入多项式的项数:";
    cin >> n;
    L = new Node;  // 建立一个带头结点的单链表
    L->next = NULL;
    for (int i = 1; i <= n; i++) {
        s = new Node;
        cout << "请输入第" << i << "项的系数和指数:";
        cin >> s->data.x >> s->data.y;//注意此步在for循环内部,每次都需要从头开始找
        pre = L; p = L->next;
        while (p && p->data.y < s->data.y) {
            pre = p;
            p = p->next;
        }
        s->next = p;
        pre->next = s;
    }
}

// 显示多项式
void Show(LinkList L) {
    Node* p;
    p = L->next;
    cout << "f(x)=";
    while (p) {
        if (p->data.x != 0) {
            if (p->data.x > 0) {
                if (p->data.y)
                    cout << "+" << p->data.x << "x^" << p->data.y;
                else
                    cout << p->data.x;
            }
            else {
                if (p->data.y)
                    cout << p->data.x << "x^" << p->data.y;
                else
                    cout << p->data.x;
            }
        }
        p = p->next;
    }
}

// 多项式相加
void Add_List(LinkList& LA, LinkList& LB) {
    Node* pa, * pb, * pc, * r;
    pc = LA;  // 复制 LA 链表作为 LC 的初始值
    pa = LA->next; pb = LB->next;
    while (pa && pb) {
        if (pa->data.y == pb->data.y) {
            pa->data.x += pb->data.x;  // 相加系数
            if (pa->data.x != 0) {  // 系数相加不为 0
                pc->next = pa;
                pc = pa;
                pa = pa->next;
                r = pb; pb = pb->next; delete r;  // 跳过当前项

            }
            else {  // 系数为 0,删除当前项
                r = pa; pa = pa->next; delete r;
                r = pb; pb = pb->next; delete r;
            }
        }
        else if (pa->data.y < pb->data.y) {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        }
        else {
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }
    }
    pc->next = pa ? pa : pb;  // 连接剩余项
    Show(LA);

}

int main() {
    int n;
    LinkList L1, L2, LC;
    cout << "开始创建第一个多项式:" << endl;
    Great_LinkList(L1);  // 创建第一个多项式
    cout << "开始创建第二个多项式:" << endl;
    Great_LinkList(L2);  // 创建第二个多项式

    cout << "你创建的第一个多项式为:";
    Show(L1);
    cout << endl;

    cout << "你创建的第二个多项式为:";
    Show(L2);
    cout << endl;

    cout << "两个多项式相加的结果为:";
    Add_List(L1, L2);
    cout << endl;
    return 0;
}
void Add_List(LinkList & LA, LinkList & LB, LinkList & LC) {
		Node* pa, * pb, * pc;
		LC = LA, detete LB;
		pa = LA->next; pb = LB->next;
		pc = LC->next;
		while (pa && pb) {
			if (pa->data.y == pb->data.y) {
				sum = pa->data.y + pb->data.y;
				if (sum) {  //系数和不为0
					pa->data.y = sum;
					pc->next = pa;
					pc = pa;
					pa = pa->next;
					r = pb; pb = pb->next; delete pb;
				}
				else {   //系数相加为0
					r = pa; pa = pa->next; delete pa;
					r = pb; pb = pb->next; delete pb;
				}
			}
			else if (pa->data.y < pb->data.y) {
				pc->next = pa;
				pc = pa;
				pa = pa->next;
			}
			else {
				pc->next = pb;
				pc = pb;
				pb = pb->next;
			
			}

			pc->next = pa ? pa : pb;
			Show(LC);

 运行结果

下面是我最初写的多项式相加的代码,传了一个LC过来,最后运行出现了错误。  

void Add_List(LinkList & LA, LinkList & LB, LinkList & LC) {
		Node* pa, * pb, * pc;
		LC = LA, detete LB;
		pa = LA->next; pb = LB->next;
		pc = LC->next;
		while (pa && pb) {
			if (pa->data.y == pb->data.y) {
				sum = pa->data.y + pb->data.y;
				if (sum) {  //系数和不为0
					pa->data.y = sum;
					pc->next = pa;
					pc = pa;
					pa = pa->next;
					r = pb; pb = pb->next; delete pb;
				}
				else {   //系数相加为0
					r = pa; pa = pa->next; delete pa;
					r = pb; pb = pb->next; delete pb;
				}
			}
			else if (pa->data.y < pb->data.y) {
				pc->next = pa;
				pc = pa;
				pa = pa->next;
			}
			else {
				pc->next = pb;
				pc = pb;
				pb = pb->next;
			
			}

			pc->next = pa ? pa : pb;
			Show(LC);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/477598.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言 自定义类型:联合和枚举

目录 前言 一、联合体 1.1 联合体的特点 1.2 联合体与结构体的区别 1.3 联合体的大小计算 1.4 联合体例子 1.5 联合体判断大小端 二、枚举 2.1 枚举类型定义 2.2 枚举类型的优点 2.3 枚举类型的使用 总结 前言 之前我们讲了C语言其中一个自定义类型结构体&#xff…

C++面试宝典第36题:骑士游历

题目 在国际象棋的棋盘上,使一个骑士遍历所有的格子一遍且仅一遍。对于任意给定的顶点,输出一条符合上述要求的路径。骑士的走法和中国象棋的马的走法一样,走日。 解析 本题是一个经典的回溯搜索问题,具体来说是求解国际象棋棋盘上骑士的遍历问题,也称为骑士巡游问题(Kni…

【链表】Leetcode 25. K 个一组翻转链表【困难】

K 个一组翻转链表 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改…

SAP前台处理:物料主数据创建<MM01>之会计视图

一、背景&#xff1a; 终于来到了物料主数据&#xff0c;我觉得物料账是SAP最重要的一项发明&#xff0c;也一直是SAP的一项重要优势&#xff0c;物料账记录了一个个物料的生生不息&#xff1b; 本章主要讲解物料主数据和财务相关的主要内容&#xff1a;这里特别提示由于作者…

脚本实现Ubuntu设置屏幕无人操作,自动黑屏

使用 xrandr 命令可以实现对屏幕的控制&#xff0c;包括调整分辨率、旋转屏幕以及关闭屏幕等。要实现 Ubuntu 设置屏幕在无人操作一段时间后自动黑屏&#xff0c;可以借助 xrandr 命令来关闭显示器。 首先&#xff0c;你需要找到系统中显示器的名称&#xff0c;可以通过运行 x…

联通短信平台有什么特点?

【直连优势&#xff0c;安全可靠】 中国联通A2P短信服务直连其内地短信通道&#xff0c;这意味着企业用户能够享受到更为直接的运营商连接服务&#xff0c;确保每一条短信都具有卓越的性能表现和无可挑剔的稳定性。这种点对点的通信模式极大地降低了信息延迟和丢失的风险&#…

[云] vmware: host: net: Net.CoaleseDefaultOn

https://communities.vmware.com/t5/Storage-Performance/Advanced-Networking-Performance-Options/ta-p/2792649 在vsphere client下的路径是&#xff1a; 选择使用的host -> 右键setting->configure-> system->advanced system setting->edit->Net.Coales…

哪些事是你当了领导才明白的?

哪些事是你当了领导才明白的&#xff1f; 毕业5年&#xff0c;17年开始带团队&#xff0c;确实很多事不做到管理这一层&#xff0c;就真的意识不到。 带着【执行者】和【管理者】这2个视角&#xff0c;再结合我毕业至今这5年的所有职场经历&#xff0c;聊聊“职场潜规则”。 …

PowerShell正则表达式匹配文件内容并输出到屏幕(或保存到文件)

代码&#xff1a; foreach ($line in Get-Content -path .\test.sql) { if ($line -match bdw_\w*.\w*) {write-output $matches[0]}}思路&#xff1a; 读取文件并遍历 foreach ($line in Get-Content -path .\test.sql) 正则匹配 if ($line -match ‘bdw_\w*.\w*’) 这个匹配…

电子考试信息软件系统设计

1 整体设计 融机改与人改、出题、答题、图表浏览、下载为一体。 每课十套试卷。随机抽题形成试卷&#xff0c;选项顺序随机打乱。 云端分布微服体系架构&#xff0c;非关系文档数据库支撑&#xff0c;合理编码数据表关联。 神禹网关调度&#xff0c;NACOS监护。 负载均衡与…

JavaWeb里的控制器Servlet,过滤器Filter,监听器Listener

文章目录 简介控制器servlet控制器(Controller)概述控制器的工作原理控制器的生命周期控制器的种类控制器的应用场景示例代码Servlet控制器示例Spring MVC控制器示例 总结 过滤器filter过滤器(Filter)概述过滤器的工作原理过滤器的生命周期过滤器的链式调用过滤器的应用场景示例…

软件测试教程 自动化测试之Junit框架

文章目录 1. 什么是 Junit &#xff1f;2. 常见的注解2.1 Test2.2 BeforeAll&#xff0c;AfterAll2.3 BeforeEach&#xff0c;AfterEach 3. 测试用例顺序指定4. 参数化4.1 单个参数4.2 多个参数4.3 通过方法生成 5. 测试套件6. 断言6.1 断言相等6.2 断言不相等6.3 断言为空6.4 …

如何从 Windows电脑恢复已删除的音频文件

在本文中&#xff0c;我们向您介绍从 Windows PC 恢复已删除的音乐/音频文件的最佳方法。 在线音乐流媒体服务正在蓬勃发展。尽管如此&#xff0c;许多用户还是下载了自己喜欢的曲目以供离线收听。此外&#xff0c;用户还出于各种目的将不同形式的音频文件&#xff08;例如录音…

HBCalculator 程序:通过 VMD 可计算分子动力学模拟中氢键密度和强度的一维和二维分布

分享一个通过 VMD 可计算分子动力学模拟中氢键密度和强度的一维和二维分布程序 HBCalculator。 感谢论文的原作者&#xff01; 主要内容 “氢键是分子系统中关键的非共价相互作用&#xff0c;对生物、化学和能量相关过程产生重大影响&#xff1b;因此&#xff0c;描述氢键信息…

DP动态规划入门(数字三角形、破损的楼梯、安全序列)

一、动态规划&#xff08;DP&#xff09;简介 动态规划&#xff08;Dynamic Programming&#xff0c;简称DP&#xff09;是运筹学的一个分支&#xff0c;它是一种通过将复杂问题分解成多个重叠的子问题&#xff0c;并通过子问题的解来构建整个问题的解的算法。在动态规划中&am…

java Flink(四十二)Flink的序列化以及TypeInformation介绍(源码分析)

Flink的TypeInformation以及序列化 TypeInformation主要作用是为了在 Flink系统内有效地对数据结构类型进行管理&#xff0c;能够在分布式计算过程中对数据的类型进行管理和推断。同时基于对数据的类型信息管理&#xff0c;Flink内部对数据存储也进行了相应的性能优化。 Flin…

Jenkins安装 Linux 更换镜像 安装插件

Jenkins安装 Linux 更换镜像 安装插件 前言 下面叙述了三种jenkins安装的方式,jenkins安装之前必须有java环境因为他是java写的… yum安装只能安装最新版本的jenkins,但是jenkins是java写的所以他强依赖java版本,当你的服务器的java版本与jenkins版本冲突时还需要给jenkins重…

2024.3.21作业

#include<myhead.h>//封装添加学生信息函数 int do_add(sqlite3 *ppDb) {//准备sql语句int add_numb 0;char add_name[20] "";double add_score 0;//提示并输入数据printf("请输入学号&#xff1a;");scanf("%d", &add_numb);print…

spring-boot如何启动WEB项目之二

文章目录 概要spring-boot项目结构踩坑1踩坑2踩坑3总结 概要 最近在做信创的项目&#xff0c;需要将原来在tomcat启动的项目&#xff0c;转移为微服务的项目&#xff0c;然后由于对spring-boot项目了解不足&#xff0c;导致耗费了一些时间来启动项目。 spring-boot项目结构 每…

YoloV8改进策略:Block改进|PKINet

摘要 PKINet是面向遥感旋转框的主干&#xff0c;网络包含了CAA、PKI等模块&#xff0c;给我们改进卷积结构的模型带来了很多启发。 论文&#xff1a;《Poly Kernel Inception Network在遥感检测中的应用》 https://export.arxiv.org/pdf/2403.06258 遥感图像&#xff08;RSI…