利用链表实现多项式的相乘以及相加

/*利用链表实现多项式的相乘以及相加
两个多项式
多项式1:3X^4 + 5X^2 +6X - 2
多项式2:5X^20 -7X^4 +3X
输入数据: 4  3  4  5  2  6  1  -2  0  输入数据对于每一个多项式而言,先指定多项式的项数,然后 
            ····· 3  5  20 -7 4  3  1           输入每一项的系数与指数 
输出数据:与上述类型一样,对多项式的系数与指数进行输出
 
程序的框架如下:
1、主函数
    读入多项式1
    读入多项式2
    进行乘法计算
    进行加法计算
2、读入多项式 4  3  4  -5  2  6  1  -2  0 3  5  20 -7 4  3  1
    输入数据是由一个项数 + 系数加指数的形式出现,在读入数据的时候要注意结点的申请
3、加法计算
    相同指数项进行合并操作
    不同项将指数大的那一项进行连接
    小的那一项保持不动
4、乘法计算
     以一个多项式为基准,使得此多项式的每一个结点(项)对另一个多项式的每一项进行乘法计算
    然后将其于最终的多项式进行加法计算
5、输出 
*/
#include<iostream>
using namespace std;
class Node{                                //定义多项式每一项的节点结构 
    public:
        int exp;
        int coefficient;
        Node * next;        
}; 
class polynomial{                        //定义多项式类 
    public:
        polynomial();                    //构造函数--需要对头节点进行初始化,分配空间 
        ~polynomial(){};                //析构函数--暂时不考虑 
        void print();                    //将多项式以系数+指数的方式进行输出 
        void append(int coef,int expo);    //将多项式进行连接--也就是链表的尾插工作 
        Node * getHead();                //返回头节点 
        Node * getTail();                //返回尾节点 
    private:
        Node * head;                    //将头节点与尾节点声明为私有 
        Node * tail; 
};
Node *polynomial::getHead(){
    return head;
}
Node * polynomial::getTail(){
    return tail;
}
polynomial::polynomial(){
    head = new Node();
    head->exp = NULL;        //如何记录一个结点的初始状态? 此处有待商榷,会出现警告 
    tail = head;
}
void polynomial::print(){
    Node * current = head;    //注意将head节点进行相应的托管 
    while(current != NULL){
        cout<<current->coefficient<<" "<<current->exp<<" "; 
        current = current->next;
    }
    cout<<endl;
}
void polynomial::append(int coef,int expo){
    if(head->exp == NULL){                //判定是否是初始化状态 
        head->coefficient = coef;
        head->exp = expo;
        head->next =NULL;
        tail = head;
    }else{
        Node *temp = new Node();
        temp->coefficient = coef;
        temp->exp = expo;
        temp->next = NULL;
        tail->next = temp;
        tail = temp;
    }
}
void initPoly(int n,polynomial poly){
    while(n--){
        int coef,exp;
        cin>>coef>>exp;
        poly.append(coef,exp);
    } 
}
polynomial  add(polynomial poly1,polynomial poly2){
    polynomial result;
    Node * temp1 =poly1.getHead();
    Node * temp2 =poly2.getHead();
    while(temp1 != NULL && temp2 != NULL){
        if(temp1->exp == temp2->exp){            //判定多项式中的前后关系 
            if(temp1->coefficient + temp2->coefficient == 0)
                ;    //在合并同类项的时候如果出现了相互抵消的状况,也就是两者有一方的系数为0,部将其纳入结果中 
            else
            result.append(temp1->coefficient + temp2->coefficient,
                            temp1->exp);        //相同的进行同类项的合并 
            temp1 = temp1->next;
            temp2 = temp2->next;
        }
        else if(temp1->exp > temp2->exp){
            result.append(temp1->coefficient,temp1->exp);
            temp1 = temp1->next;
        }
        else{
            result.append(temp2->coefficient,temp2->exp);
            temp2 = temp2->next;
        }
    }
    if(temp1 == NULL){                    //当多项式中的一方遍历完成,则另一个多项式之后的所有都加入到结果之中 
        result.getTail()->next = temp2;
    }    
    else{
        result.getTail()->next = temp1;
    }
    return result;
}
polynomial  multiply(polynomial poly1,polynomial poly2){
    polynomial result;
    Node * temp1 =poly1.getHead();    
    while(temp1 != NULL ){
        polynomial result1;
        Node * temp2 =poly2.getHead();        //由于要遍历多次,所以要多次进行声明,由于局部变量是存放在栈中,执行过后将会自动进行清空,所以并不需要将其释放,如果是利用malloc在堆上进行声明的变量要进行手动的释放空间 
        while (temp2 != NULL){
            result1.append(temp1->coefficient * temp2->coefficient,
                    temp1->exp + temp2->exp);
            temp2 = temp2->next;
        }
        if(temp1 == poly1.getHead()){
            result = result1;
        }
        else{            
            result = add(result,result1);        
        }
        temp1 = temp1->next;
    }
    return result;
}
int main(){
    polynomial poly1,poly2,result1,result2;
    int n1,n2;
    cin>>n1;
    initPoly(n1,poly1);
    cin>>n2;
    initPoly(n2,poly2);
    cout<<"多项式1初始化为:"<<endl; 
    poly1.print();
    cout<<"多项式2初始化为:"<<endl; 
    poly2.print();        
    result1 = add(poly1,poly2);
    cout<<"多项式1 + 多项式2的结果为:"<<endl; 
    result1.print();
    result2 =multiply(poly1,poly2);
    cout<<"多项式1 * 多项式2的结果为:"<<endl; 
    result2.print();
    return 0;
}

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于实现多项式相加相乘,可以使用单链表来存储多项式的每一项。 首先,我们可以创建一个节点类来表示多项式中的每一项: ```java class Node { int coefficient; // 系数 int exponent; // 指数 Node next; // 下一个节点 Node(int coefficient, int exponent) { this.coefficient = coefficient; this.exponent = exponent; this.next = null; } } ``` 然后,我们可以创建一个链表类来管理多项式的各个节点: ```java class Polynomial { Node head; Polynomial() { this.head = null; } // 添加节点 void addTerm(int coefficient, int exponent) { Node newNode = new Node(coefficient, exponent); if (head == null) { head = newNode; } else { Node temp = head; while (temp.next != null) { temp = temp.next; } temp.next = newNode; } } } ``` 接下来,我们可以实现多项式相加相乘的方法: ```java class PolynomialOperations { // 相加两个多项式 static Polynomial addPolynomials(Polynomial poly1, Polynomial poly2) { Polynomial result = new Polynomial(); Node p1 = poly1.head; Node p2 = poly2.head; while (p1 != null && p2 != null) { if (p1.exponent == p2.exponent) { result.addTerm(p1.coefficient + p2.coefficient, p1.exponent); p1 = p1.next; p2 = p2.next; } else if (p1.exponent > p2.exponent) { result.addTerm(p1.coefficient, p1.exponent); p1 = p1.next; } else { result.addTerm(p2.coefficient, p2.exponent); p2 = p2.next; } } while (p1 != null) { result.addTerm(p1.coefficient, p1.exponent); p1 = p1.next; } while (p2 != null) { result.addTerm(p2.coefficient, p2.exponent); p2 = p2.next; } return result; } // 相乘两个多项式 static Polynomial multiplyPolynomials(Polynomial poly1, Polynomial poly2) { Polynomial result = new Polynomial(); Node p1 = poly1.head; while (p1 != null) { Node p2 = poly2.head; while (p2 != null) { result.addTerm(p1.coefficient * p2.coefficient, p1.exponent + p2.exponent); p2 = p2.next; } p1 = p1.next; } return result; } } ``` 使用示例: ```java public class Main { public static void main(String[] args) { Polynomial poly1 = new Polynomial(); poly1.addTerm(2, 3); poly1.addTerm(1, 2); poly1.addTerm(3, 0); Polynomial poly2 = new Polynomial(); poly2.addTerm(1, 2); poly2.addTerm(2, 1); poly2.addTerm(4, 0); Polynomial sum = PolynomialOperations.addPolynomials(poly1, poly2); Polynomial product = PolynomialOperations.multiplyPolynomials(poly1, poly2); System.out.println("Sum of polynomials: "); printPolynomial(sum); System.out.println("Product of polynomials: "); printPolynomial(product); } // 打印多项式 static void printPolynomial(Polynomial poly) { Node temp = poly.head; while (temp != null) { System.out.print(temp.coefficient + "x^" + temp.exponent); if (temp.next != null) { System.out.print(" + "); } temp = temp.next; } System.out.println(); } } ``` 这样,我们就可以使用单链表实现多项式相加相乘了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值