首页 > 其他分享 >链表实现多项式的相加相减以及修改指定指数系数

链表实现多项式的相加相减以及修改指定指数系数

时间:2025-01-07 18:31:46浏览次数:3  
标签:相减 temp 多项式 poly1 next 链表 expn poly2 coaf

#include <iostream>
using namespace std;

// 定义多项式节点结构
typedef struct PolyNode {
    int coaf;  // 系数
    int expn;  // 指数
    struct PolyNode* next; // 指向下一个节点的指针
} PolyNode, *Poly;

// 创建多项式节点
Poly createNode(int coaf, int expn) {
    Poly newNode = new PolyNode();
    newNode->coaf = coaf;
    newNode->expn = expn;
    newNode->next = nullptr;
    return newNode;
}

// 插入节点到多项式中(按指数从小到大排序,并合并同类项)
void insertNode(Poly& head, int coaf, int expn) {
    if (coaf == 0) return; // 如果系数为 0,直接忽略

    Poly newNode = createNode(coaf, expn);
    if (!head) {
        head = newNode;
        return;
    }

    Poly temp = head;
    Poly prev = nullptr;

    // 查找插入位置
    while (temp && temp->expn < expn) {
        prev = temp;
        temp = temp->next;
    }

    // 如果指数相等,合并同类项
    if (temp && temp->expn == expn) {
        temp->coaf += coaf;
        if (temp->coaf == 0) { // 如果合并后系数为 0,删除该节点
            if (prev) {
                prev->next = temp->next;
            } else {
                head = temp->next;
            }
            delete temp;
        }
        delete newNode; // 释放新节点的内存
        return;
    }

    // 插入新节点
    if (!prev) {
        newNode->next = head;
        head = newNode;
    } else {
        newNode->next = prev->next;
        prev->next = newNode;
    }
}

// 打印多项式
void printPoly(Poly head) {
    if (!head) {
        cout << "0" << endl;
        return;
    }
    Poly temp = head;
    bool isFirstTerm = true; // 标记是否为第一项
    while (temp) {
        // 处理符号
        if (!isFirstTerm) {
            if (temp->coaf > 0) {
                cout << " + ";
            } else {
                cout << " - ";
            }
        } else {
            if (temp->coaf < 0) {
                cout << "-";
            }
            isFirstTerm = false;
        }
        // 处理系数和指数
        cout << abs(temp->coaf); // 打印系数的绝对值
        if (temp->expn != 0) {
            cout << "x^" << temp->expn;
        }
        temp = temp->next;
    }
    cout << endl;
}

// 多项式相加
Poly addPoly(Poly poly1, Poly poly2) {
    Poly result = nullptr;
    while (poly1 || poly2) {
        if (!poly1) {
            insertNode(result, poly2->coaf, poly2->expn);
            poly2 = poly2->next;
        } else if (!poly2) {
            insertNode(result, poly1->coaf, poly1->expn);
            poly1 = poly1->next;
        } else if (poly1->expn == poly2->expn) {
            insertNode(result, poly1->coaf + poly2->coaf, poly1->expn);
            poly1 = poly1->next;
            poly2 = poly2->next;
        } else if (poly1->expn < poly2->expn) {
            insertNode(result, poly1->coaf, poly1->expn);
            poly1 = poly1->next;
        } else {
            insertNode(result, poly2->coaf, poly2->expn);
            poly2 = poly2->next;
        }
    }
    return result;
}

// 多项式相减
Poly subtractPoly(Poly poly1, Poly poly2) {
    Poly result = nullptr;
    while (poly1 || poly2) {
        if (!poly1) {
            insertNode(result, -poly2->coaf, poly2->expn);
            poly2 = poly2->next;
        } else if (!poly2) {
            insertNode(result, poly1->coaf, poly1->expn);
            poly1 = poly1->next;
        } else if (poly1->expn == poly2->expn) {
            insertNode(result, poly1->coaf - poly2->coaf, poly1->expn);
            poly1 = poly1->next;
            poly2 = poly2->next;
        } else if (poly1->expn < poly2->expn) {
            insertNode(result, poly1->coaf, poly1->expn);
            poly1 = poly1->next;
        } else {
            insertNode(result, -poly2->coaf, poly2->expn);
            poly2 = poly2->next;
        }
    }
    return result;
}

// 修改多项式的系数或指数
void modifyPoly(Poly& head, int oldExpn, int newCoaf, int newExpn) {
    Poly temp = head;
    Poly prev = nullptr;

    // 查找要修改的节点
    while (temp && temp->expn != oldExpn) {
        prev = temp;
        temp = temp->next;
    }

    if (!temp) {
        cout << "未找到指定指数的项!" << endl;
        return;
    }

    // 删除旧节点
    if (prev) {
        prev->next = temp->next;
    } else {
        head = temp->next;
    }
    delete temp;

    // 插入新节点
    insertNode(head, newCoaf, newExpn);
}

// 释放多项式内存
void freePoly(Poly& head) {
    Poly temp;
    while (head) {
        temp = head;
        head = head->next;
        delete temp;
    }
}

// 功能菜单
void menu() {
    cout << "========== 多项式操作菜单 ==========" << endl;
    cout << "1. 输入多项式" << endl;
    cout << "2. 打印多项式" << endl;
    cout << "3. 多项式相加" << endl;
    cout << "4. 多项式相减" << endl;
    cout << "5. 修改多项式的系数或指数" << endl;
    cout << "6. 退出" << endl;
    cout << "====================================" << endl;
}

int main() {
    Poly poly1 = nullptr;
    Poly poly2 = nullptr;
    int choice;

    while (true) {
        menu();
        cout << "请选择: ";
        cin >> choice;

        if (choice == 1) {
            int coaf, expn;
            cout << "输入多项式1的项数: ";
            int n;
            cin >> n;
            for (int i = 0; i < n; i++) {
                cout << "输入第 " << i + 1 << " 项的系数和指数: ";
                cin >> coaf >> expn;
                insertNode(poly1, coaf, expn);
            }
            cout << "输入多项式2的项数: ";
            cin >> n;
            for (int i = 0; i < n; i++) {
                cout << "输入第 " << i + 1 << " 项的系数和指数: ";
                cin >> coaf >> expn;
                insertNode(poly2, coaf, expn);
            }
        } else if (choice == 2) {
            cout << "多项式1: ";
            printPoly(poly1);
            cout << "多项式2: ";
            printPoly(poly2);
        } else if (choice == 3) {
            Poly result = addPoly(poly1, poly2);
            cout << "多项式1 + 多项式2 = ";
            printPoly(result);
            freePoly(result);
        } else if (choice == 4) {
            Poly result = subtractPoly(poly1, poly2);
            cout << "多项式1 - 多项式2 = ";
            printPoly(result);
            freePoly(result);
        } else if (choice == 5) {
            int polyChoice, oldExpn, newCoaf, newExpn;
            cout << "选择要修改的多项式 (1 或 2): ";
            cin >> polyChoice;
            if (polyChoice != 1 && polyChoice != 2) {
                cout << "无效选择!" << endl;
                continue;
            }
            cout << "输入要修改的项的指数: ";
            cin >> oldExpn;
            cout << "输入新的系数和指数: ";
            cin >> newCoaf >> newExpn;
            if (polyChoice == 1) {
                modifyPoly(poly1, oldExpn, newCoaf, newExpn);
            } else {
                modifyPoly(poly2, oldExpn, newCoaf, newExpn);
            }
        } else if (choice == 6) {
            break;
        } else {
            cout << "无效选择,请重试!" << endl;
        }
    }

    // 释放内存
    freePoly(poly1);
    freePoly(poly2);

    return 0;
}

标签:相减,temp,多项式,poly1,next,链表,expn,poly2,coaf
From: https://blog.csdn.net/2302_80623053/article/details/144991117

相关文章

  • 剑指Offer|LCR 023. 相交链表
    LCR023.相交链表给定两个单链表的头节点headA和headB,请找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回null。图示两个链表在节点c1开始相交**:**题目数据保证整个链式结构中不存在环。注意,函数返回结果后,链表必须保持其原始结构。示例1......
  • C++学习笔记#01——指针与链表
    在自学C++的时候,发现指针是一个很难绕开的东西,看了一些参考资料和别人的程序,写一些垃圾。Part1指针指针是一个指向一片内存地址的变量,相当于家的门牌号。我们即可以通过变量名来访问一个变量,也可以通过它对应的地址来访问。就像你的老师可以点你的名字找你,也可以找你宿舍的门......
  • 142环形链表
    最简单的思路:哈希。进阶那个快慢指针确实想不到。//哈希,空间为O(n)classSolution{public:ListNode*detectCycle(ListNode*head){unordered_set<ListNode*>adds;if(head==nullptr)returnNULL;ListNode*cur=head;......
  • 合并两个排序的链表(C++)
    问题描述输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。数据范围:0≤n≤10000≤n≤1000,−1000≤节点值≤1000−1000≤节点值≤1000要求:空间复杂度O(1)O(1),时间复杂度O(n)O(n)如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,......
  • python中的链表
    在Python中,链表不是内置的数据结构,但可以通过类的方式实现自定义链表。以下是链表在刷算法题中常用的语法和操作方法。1.定义链表节点链表节点是一个包含值和指向下一个节点的指针的结构:classListNode:def__init__(self,val=0,next=None):self.val=val......
  • 138. 随机链表的复制(中)
    目录题目哈希表题目深拷贝一个链表,要求新链表中的每个节点都是新创建的,并且这些节点的random指针都指向新链表中的相应节点。哈希表先使用Map建立映射,然后根据映射将random和next指针指向对应的节点或者nullvarcopyRandomList=function(head){//如果链表为空......
  • 25考研王道数据机构课后习题-----顺序表链表部分
    文章目录1.顺序表题目2.链表相关题目3.我的个人总结声明:以下内容来自于B站知名up主白话拆解数据结构,望获悉;1.顺序表题目下面的这个说的是:下面的哪一个是组成我们的顺序表的有限序列,这个应该是数据元素,n个字符组成的这个内容我们称之为字符,数据项表示的是我们的这......
  • 大一计算机的自学总结:单双链表的反转
    前言为了减少单个文件里的代码量(懒),于是将能用到的函数都写进一个.h文件里了。其中大部分函数都在我“初见链表”的文章里写过了。#include<bits/stdc++.h>usingnamespacestd;typedefstructnode{ intvalue; structnode*next;}Node;typedefstructnodeD{ ......
  • 25. K 个一组翻转链表(难)
    目录题目法一、模拟--迭代法二、递归题目给你链表的头节点head,每k个节点一组进行翻转,请你返回修改后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际......
  • 创作错误(每次重新启动丢失原链表)
    #include<stdio.h>#include<conio.h>#include<windows.h>#include<stdlib.h>#include<string.h>#include<time.h>voidgotoxy(intx,inty){  COORDpos={x,y};  HANDLEhOut=GetStdHandle(STD_OUTPUT_HANDLE);......