基于链表实现(java)的多项式加法和乘法

本文介绍了一种使用链表实现多项式加法和乘法的方法,通过定义多项式类和节点类,实现了多项式的输入、加法及乘法运算。文章详细展示了算法流程,并通过实例演示了如何操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.baidu.line;

import java.util.Scanner;

public class Dolynomial {
	private Node first;
	private Node last;
	private int N;
	
	private class Node{
		int coef;		//存放系数	
		int expo;		//存放指数
		Node next;
	}
	
	public boolean isEmpty() {
		return N == 0;
	}
	
	public int size() {
		return N;
	}
	
	public void enqueue(int coef, int expo) {
		Node oldlast = last;
		last = new Node();
		last.coef = coef;
		last.expo = expo;
		last.next = null;
		if(N == 0) {
			first = last;
		} else
			oldlast.next = last;
		N++;
	}
	
	/*public void insertion(Node n, int index) {
		Node temp = first;
		while(index-- > 0) {
			temp = temp.next;
		}
		n.next = temp.next;
		temp.next = n;
	}*/
	
	public static Dolynomial addition(Dolynomial D1, Dolynomial D2) {
		Dolynomial temp = new Dolynomial();
		Node node1 = D1.first;
		Node node2 = D2.first;
		int n1 = D1.size();
		int n2 = D2.size();
		while(n1 > 0 && n2 > 0) {
			if(node1.expo > node2.expo) {
				temp.enqueue(node1.coef, node1.expo);
				node1 = node1.next;
				n1--;
			} else if(node1.expo < node2.expo) {
				temp.enqueue(node2.coef, node2.expo);
				node2 = node2.next;
				n2--;
			} else {
				if(node1.coef + node2.coef != 0)
					temp.enqueue(node1.coef + node2.coef, node1.expo);
				node1 = node1.next;
				node2 = node2.next;
				n1--;
				n2--;
			}
		}
		
		while(n1-- > 0) {
			temp.enqueue(node1.coef, node1.expo);
			node1 = node1.next;
		}
			
		while(n2-- > 0) {
			temp.enqueue(node2.coef, node2.expo);
			node2 = node2.next;
		}
		
		return temp;
	}
	
	//读入一个多项式
	public static Dolynomial read() {
		Dolynomial temp = new Dolynomial();
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入多项式项数:");
		int N = sc.nextInt();
		for (int i = 0; i < N; i++) {
			System.out.println("请输入第" + (i + 1) + " 项,其中第一个为系数,第二个为指数");
			int coef = sc.nextInt();
			int expo = sc.nextInt();
			temp.enqueue(coef, expo);
		}
		return temp;
	} 
	
	
	//多项式的乘法
	public Dolynomial multi(Dolynomial D1, Dolynomial D2) {
		Dolynomial temp = new Dolynomial();
		Node node1 = D1.first;
		Node node2 = D2.first;
		
		int n1 = D1.size();
		int n2 = D2.size();
		
		while(n2-- > 0) {
			temp.enqueue(node1.coef * node2.coef, node1.expo + node2.expo);
			node2 = node2.next;
		}
		
		while(--n1 > 0) {
			//System.out.println("几条这样的语句就是几次循环~");
			
			Node node3 = temp.first;
			node1 = node1.next;
			node2 = D2.first;
			n2 = D2.size();
			
			while(n2 > 0) {
				//System.out.println("这个也一样哦!");
				int c = node1.coef * node2.coef;
				int e = node1.expo + node2.expo;
				while(node3.next != null && node3.next.expo > e)
					node3 = node3.next;
				if(node3.next != null && node3.next.expo == e) {
					//指数相等,直接相加
					node3.next.coef += c;
					if(node3.next.coef == 0) {
						node3 = node3.next.next;
					}
				} else {
					//插入节点
					Node p = new Node();
					p.coef = c;
					p.expo = e;
					p.next = node3.next;
					node3.next = p;
					temp.N++;
				}
				
				n2--;
				node2 = node2.next;
			}
		}
		return temp;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Dolynomial d1, d2, result1, result2;
		d1 = read();
		d2 = read();
		System.out.println(d1.size() + d2.size());
		System.out.println("分割线-------------------");
		result1 = addition(d1, d2);
		Node temp1 = result1.first;
		for (; temp1 != null; temp1 = temp1.next) {
			System.out.println(temp1.coef + " " + temp1.expo);
		}
		System.out.println("分割线-------------------");
		result2 = d1.multi(d1, d2);
		Node temp2 = result2.first;
		System.out.println(result2.size());
		for (; temp2 != null; temp2 = temp2.next) {
			System.out.println(temp2.coef + " " + temp2.expo);
		}
	}

}

总结:

       在刚看到这题目时,觉得很简单,可真正做起来还是问题百出,差不多花了三四个小时,效率太低,经常犯一些简单、低级的错误,包括一些命令的不熟悉。俗话说的的好,三天不写手生,希望自己以后勤加练习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值