【链表应用】| 一元多项式的操作

news2024/11/27 10:28:38

目录

  • 一. 🦁 要求:
  • 二. 代码实现(Java & c)
    • 1. Java实现
    • 2.C语言实现
  • 三. 🦁 总结

在这里插入图片描述

一. 🦁 要求:

设有两个一元多项式:
p(x)=p0+p1x+p2x2+···+pnxn
q(x)=q0+q1x+q2x2+···+qmxm
多项式项的系数为实数,指数为整数,设计实现一元多项式操作的程序:

  1. 多项式链表建立:以(系数,指数)方式输入项建立多项式,返回所建立的链表的头结点;
  2. 多项式排序: 将所建立的多项式按指数非递减(从小到大) 进行排序
  3. 多项式相加: 实现两个多项式相加操作。操作生成一个新的多项式,原有的两个多项式不变,返回生成的多项式的头指针;
  4. 多项式的输出: 按照po+p1x+p2x2+···+pnxn 格式输出多项式;

二. 代码实现(Java & c)

1. Java实现

Java是一时兴起创作,有bug希望提出!

public class SingleLinkedList {

     class Node{
        private Integer cof;            //系数
        private Integer exp;            //指数
        private Node next;
        public Node(Integer cof,Integer exp,Node next){
            this.cof = cof;
            this.exp = exp;
            this.next = next;
        }

        public Integer getCof() {
            return cof;
        }

        public void setCof(Integer cof) {
            this.cof = cof;
        }

        public Integer getExp() {
            return exp;
        }

        public void setExp(Integer exp) {
            this.exp = exp;
        }

        public Node getNext() {
            return next;
        }

        public void setNext(Node next) {
            this.next = next;
        }
    }
    private Node head;      //存放头结点
    private int size;       //记录元素个数

    private Node getTail(){
        if (this.head == null) return null;
        Node node = this.head;
        while(node.next != null){
            node = node.next;
        }
        return node;
    }

    /**
     * 添加元素
     * @param cof
     * @param exp
     */
    public void add(Integer cof,Integer exp){
        Node tail = getTail();
        Node node = new Node(cof,exp,null);
        if (tail == null){
            this.head = node;
        }else {
            tail.next = node;
        }
        this.size++;
    }

    /**
     * 获取元素
     * @param index
     * @return
     */
    public Node getNode(int index){
        checkIndex(index);
        Node node = this.head;
        for (int i = 0;i<index;i++){
            node = node.next;
        }
        return node;
    }

    /**
     * 检查index合法性
     * @param index
     * @throws IndexOutOfBoundsException
     */
    private void checkIndex(int index) throws IndexOutOfBoundsException {
        if(index < 0 || index >= this.size){
            throw  new IndexOutOfBoundsException(index+"指针溢出");
        }
    }

    public Node getHead() {
        return head;
    }

    public void setHead(Node head) {
        this.head = head;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }
    public void sort(){
        Node p,q;
        int temp1;
        int temp2;
        for(p=this.head;p != null;p = p.next){
            for (q = p.next;q != null;q = q.next){
                if(p.exp > q.exp){
                    temp1 = p.exp;
                    p.exp = q.exp;
                    q.exp = temp1;

                    temp2 = p.cof;
                    p.cof = q.cof;
                    q.cof = temp2;
                }
            }
        }
    }


    public Node addMethod(Node head1,Node head2){
        Node node = new Node(-1,-1,null);
        Node p = head1,q = head2 ,b = node;
        while (p != null && q != null){
            if (p.exp == q.exp){
                int res = p.cof+q.cof;
                Node node1 = new Node(res, p.exp, null);
                b.next = node1;
                b = node1;
                p = p.next;
                q = q.next;

            }else if (p.exp < q.exp){
                b.next = p;
                b = b.next;
                p = p.next;

            }else{
                b.next = q;
                b = b.next;
                q = q.next;
            }
        }
        if (p != null){
            b.next = p;
        }else {
            b.next = q;
        }
        return node.next;
    }


}

2.C语言实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct 
{
	float radio;				//系数
	int index;					//指数
}Data;


typedef struct node
{
	Data data;					//数据域
	struct Node* next;			//指针域
	struct Node* prev;
}Node;


static char scan[100];
char* SetScan(char* str)
{
	
	strcpy(scan, str);
	int i ;
	for (i = 0; i <= strlen(str) - 1; i++)
	{
		if (str[i] == '(' || str[i] == ')'||str[i]==',')
		{
			scan[i] = ' ';
		}
	}
	return scan;
}
void SetPol(Node ** head,int tindex,double tradio)
{
	
	Data temp;
	temp.index = tindex;
	temp.radio = tradio;
	Node* curr = NULL,*tail = *head,*prev = *head;
	if(*head)
		for (; tail->next; tail = tail->next)
		{
			prev = last->next;
		}
	if (*head != NULL)
	{
		curr= (Node*)malloc(sizeof(Node));
		curr->data = temp;
		curr->next = NULL;
		curr->prev = NULL;
		*head = curr;
	}
	else
	{
		curr = (Node*)malloc(sizeof(Node));
		curr->data = temp;
		curr->next = NULL;
		curr->prev = prev;
		tail->next = curr;
	}
	
}
void DeleteNode(Node **curr)
{
	if ((*now)->prev)
	{
		Node* temp = (*curr)->prev;
		temp->next = (*curr)->next;
		*curr = (*curr)->prev;

	}
	else
	{
		Node *temp = *curr;
		*curr = NULL;
		free(temp);
	}
	
}
void ArrPol(Node **head)
{
	Data temp;
	Node *p1 = *head;
	Node *p2 = *head; 
	for(p1 = *head;p1;p1=p1->next)
		for (p2 = p1; p2; p2 = p2->next)
		{
			if (p1->data.index > p2->data.index)
			{
				temp = p1->data;
				p1->data = p2->data;
				p2->data = temp;
			}
			else if (p1->data.index == p2->data.index&&p1!=p2)
			{
				p1->data.radio += p2->data.radio;
				DeleteNode(&p2);
			}
		}
}
Node* merge_pol(Node* head1,Node* head2,int op)
{
	Node* p1 = head1, * p2 = head2;
	static Node* head = NULL;
	head = NULL;
	while (p1 || p2)
	{
		if (p1)
		{
			if (!p2 || p1->data.index < p2->data.index)
			{
				set_pol(&head, p1->data.index, p1->data.radio);
				p1 = p1->next;
			}
			else if (p2 && p1->data.index == p2->data.index)
			{
				if (!op) SetPol(&head, p1->data.index, p1->data.radio + p2->data.radio);
				else SetPol(&head, p1->data.index, p1->data.radio - p2->data.radio);
				p1 = p1->next;
				p2 = p2->next;
			}
		}
		if (p2)
		{
			if (!p1 || p1->data.index > p2->data.index)
			{
				if (!op)	SetPol(&head, p2->data.index, p2->data.radio);
				else SetPol(&head, p2->data.index, -p2->data.radio);
				p2 = p2->next;
			}
			else if (p1 && p1->data.index == p2->data.index)
			{
				if (!op) SetPol(&head, p1->data.index , p1->data.radio + p2->data.radio);
				else SetPol(&head, p1->data.index, p1->data.radio - p2->data.radio);
				p1 = p1->next;
				p2 = p2->next;
			}
		}
	}
	return head;
}
void print(Node* head)
{
	Node* curr;
	int flag = 0;
	for (curr = head; curr; curr = curr->next)
	{
		if (curr->data.radio)
		{
			if (!flag)

			{
				printf("%.2g", curr->data.radio);
				flag = 1;
			}
			else
			{
				printf("%+.2g", now->data.radio);
			}
			if (now->data.index)
				printf("x%d", now->data.index);
		}
		
	}
}
int main()
{
	Node* head1=NULL, *head2=NULL, *head=NULL;
	printf("请按照“(系数,指数)”的形式输入第一个多项式,输入“()”以结束\n");
	float radio;
	int index;
	char str[100] = { 0 };
	while (scanf("%s", str) &&strcmp(str,"()"))
	{
		strcpy(scan,set_scan(str));
		sscanf(scan, "%lf %d", &radio, &index);
		SetPol(&head1, radio, index);
	}
	printf("请按照“系数 指数”的形式输入第二个多项式,输入“()”以结束\n");
	while (scanf("%s", str) && strcmp(str, "()"))
	{
		strcpy(scan, set_scan(str));
		sscanf(scan,"%lf %d", &radio, &index);
		set_pol(&head2, radio, index);
	}
	ArrPol(&head1);
	ArrPol(&head2);

	printf("多项式相加所得结果为\n");
	head = merge_pol(head1, head2, 0);
	print(head);
	printf("多项式相减所得结果为\n");
	head = merge_pol(head1, head2, 1);
	print(head);
	
	return 0;
}

在这里插入图片描述

三. 🦁 总结

一个简单的链表操作应用,希望你喜欢

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

11个免费的数据可视化工具推荐

数据可视化之所以流行&#xff0c;不仅是因为它简化了我们查看复杂数据的方式&#xff0c;更是因为数据可视化可以加快我们获取数据信息的速度。 本文专门为您列出了11个免费的数据可视化工具&#xff0c;帮助您快速掌握数据可视化技能。 1.即时设计 即时设计是可云端编辑的…

物通博联工业物联网解决方案,助力工厂实现设备远程运维

各类设备制造工厂随着经营规模与业务的扩张&#xff0c;设备可以销往全国各地甚至是全球&#xff0c;是工厂实力的体现。当设备越来越多、分布越来越广&#xff0c;设备管理的工作量和成本直线上升&#xff0c;可能面对维护不及时的情况&#xff0c;影响到客户经济效益和对工厂…

spark源码 spark on yarn环境的创建

1.入口类 sparkSubmit 的main方法 提交application submitnew SparkSubmit submit.doSubmit(args) -> super.doSubmit(args): parseArguments(args) &#xff1a;参数解析 方法 中 new sparkSubmitArguments(args) 点进去该类(主要解析参数)&#xff0c;然后找到parse&am…

C/C++ 内存管理 new delete operator new与operator delete函数 内存泄漏

C/C 内存分布 在C/C 当中有 &#xff1a; 局部数据静态数据和全局数据常量数据动态申请数据 上述不同的数据存储的位置也不同&#xff0c;&#xff1a; 1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长的。2. 内存映射段是高效的I/O映射方式&…

Java运算符详解

目录 &#x1f511;前言 &#x1f3bd;算式运算符 ⚙赋值运算符 &#x1f34a;关系运算符 &#x1f37a;逻辑运算符 &#x1f352;位运算符 &#x1f339;移位运算符 &#x1f343;条件运算符 &#x1f349;运算符优先级 &#x1f511;前言 任何一个程序都离不开计算问题&…

IOC/DI配置管理第三方bean(Druid/C3P0)

文章目录 1 案例:数据源对象管理1.1 环境准备1.2 思路分析1.3 实现Druid管理步骤1:导入druid的依赖步骤2:配置第三方bean步骤3:从IOC容器中获取对应的bean对象步骤4:运行程序 1.4 实现C3P0管理步骤1:导入C3P0的依赖步骤2:配置第三方bean步骤3:运行程序 2 加载properties文件2.1…

详解MySQL的并发控制

目录 1.概述 2.事务 2.1.什么是事务 2.2.事务的隔离级别 2.2.1.三种数据一致性问题 2.2.2.四种隔离级别 2.3.如何设置隔离级别 3.锁 3.1.锁与事务的关系 3.2.分类 3.3.表锁 3.3.1.概述 3.3.2.读锁 3.3.3.写锁 3.3.4.保护机制 3.4.行锁 3.4.1.概述 3.4.2.什么…

Redis Java API操作

1、普通maven工程方式 Redis不仅可以通过命令行进行操作&#xff0c;也可以通过JavaAPI操作&#xff0c;通过使用Java API来对Redis数据库中的各种数据类型操作 导入POM依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http…

【Linux Network】传输层协议——UDP

目录 传输层 端口号 端口号范围划分 认识知名端口号(Well-Know Port Number) netstat pidof UDP协议 UDP协议端格式 UDP的特点 面向数据报 UDP的缓冲区 UDP使用注意事项 基于UDP的应用层协议 UDP详解&#x1f337; 传输层 在TCP/IP协议中可以把网络简单的划分为四个部分&#…

大数据如何助力营销(3)产品定位

在市场竞争日益激烈的环境下&#xff0c;产品定位是企业成功的关键因素之一。产品定位是指根据目标市场和目标消费者的需求、偏好和期望&#xff0c;确定产品的特性、功能、形象和价值&#xff0c;并与竞争对手的产品进行差异化的过程。产品定位不仅影响产品的设计、开发、生产…

全面讲解涂鸦PaaS2.0开发平台!物联网干货预警

之前我们有介绍过涂鸦 IoT PaaS&#xff08;点击查看往期介绍&#xff09;&#xff0c;面向开发生态&#xff0c;它集成了云开发、App 开发、硬件开发三大核心支撑能力&#xff0c;能够全方位助力开发者打造极具竞争力的个性化 IoT 解决方案&#xff0c;极大地降低 IoT 开发门槛…

Appium APP自动化环境搭建

1.下载安装 F:\android-sdk-windows F:\Appium-windows-1.21.0 F:\nodejs 2.创建一个bat文件&#xff0c;命名为appium.bat&#xff0c;并在其中写入如下内容&#xff1a; node Appium安装目录\resources\app\node_modules\appium\build\lib\main.js %* 注意&#xff1a;请…

从0到1开始,一步步搭建Web自动化测试框架

测试框架的设计有两种思路&#xff0c;一种是自底向上&#xff0c;从脚本逐步演变完善成框架&#xff0c;这种适合新手了解框架的演变过程。另一种则是自顶向下&#xff0c;直接设计框架结构和选取各种问题的解决方案&#xff0c;这种适合有较多框架事件经验的人。本章和下一张…

【zabbix】批量监控端口,自动发现规则

快速搞定端口批量监控 一、脚本及配置 1、&#xff08;文件名&#xff1a;check_port.py&#xff09;&#xff08;python2.7版本&#xff09; 存在路径&#xff1a;/etc/zabbix/zabbix_agentd.d/check_port.py 这个脚本有一部分内容是我从百度上找的&#xff0c;有一部分自己…

【C++】红黑树的实现

文章目录 &#x1f4d5; 概念特性 &#x1f4d5; 红黑树具体实现节点定义结构框架插入 &#x1f4d5; 概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个…

Python基础(四)

目录 一、程序的组织结构 1、前言 二、顺序结构 1、介绍 三、对象的布尔值 1、介绍 2、规定 四、分支结构 1、单分支if结构 1、语法语义 2、语法结构 3、案例 2、双分支if...else结构 1、语法语义 2、语法结构 3、案例 3、多分支if...elif...else结构 1、语…

Java语言---栈与队列

目录 一.栈 1.1栈的概念 1.2.栈的实现 1.2.1数组实现 栈 栈的创建 栈的基本方法实现 1.2.2链表实现 栈 栈的创建 栈的基本方法实现 二.队列 2.1队列的概念 2.2队列的实现 2.3代码实现 2.3.1队列代码的构建 2.3.2 队列 基础方法实现 总结 &#x1f63d;个人主页…

深入理解2D卷积和3D卷积

文章目录 卷积核的维度2D卷积单通道多通道代码example2d卷积操作后变化 3D卷积单通道多通道代码 在项目中用到了conv3但是对其背后的原理还有一些模糊的地方&#xff0c;conv2d与多通道的conv2d的区别在哪里&#xff1f;conv3d的思想理论是什么&#xff1f;对此进行探究和记录……

「AI之劫」:当机器超越人类底线,正在侵犯我们的创造力和道德

随着AI技术的不断发展&#xff0c;AI生成内容&#xff08;AIGC&#xff09;已经成为数字娱乐、商业营销和学术研究等领域的热门话题。随着人工智能技术的不断发展越来越多的领域开始应用AI技术&#xff0c;其中之一就是内容生成领域。 AIGC全称为AI-Generated Content, 指基于生…

2023年5月广州/深圳制造业产品经理很适合考的证书-NPDP

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…