浙大数据结构第二周02-线性结构2 一元多项式的乘法与加法运算

这篇具有很好参考价值的文章主要介绍了浙大数据结构第二周02-线性结构2 一元多项式的乘法与加法运算。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目详情:

设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0

输入样例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

输出样例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0

主要思路:

求和的其实课本上讲过了,就是分别遍历L1和L2,

(1)两者如果指数不等则将指数大的节点加入新链表,同时移动新链表与加入节点的指针;

(2)两者如果指数相等则系数相加,同时要判断两者是否为0,不为0时再把合并后接入新链表

(3)如果最后L1或L2有多余直接一次性接入

本题难点在于乘法

我的思路是利用之前实现的多项式加法函数,将多项式乘法转化为多项式加法

(1)用L1的每一项乘整个L2,得到一个多项式

(2)将新得到的多项式与L1前一项与整个L2相乘结果相加

如此便可以得到最终乘法结果

第一次写错误:

(1)每次遍历链表时都会忘记移动指针

(2)题目要求0多项式输出0 0 ,所以首先系数如果是0就不要加入链表,最后如果链表为空打印链表时打印 0 0文章来源地址https://www.toymoban.com/news/detail-536317.html

代码实现:

#include <stdio.h>
#include <stdlib.h>
/*链表表示多项式的数据结构*/
typedef struct ListNode ListNode;
typedef ListNode* List;
struct ListNode {
    int Coefficient, Exponent;
    List Next;
};
/*实现尾插法的函数*/
void Attach(int coef, int expo, List* rear) {   //传rear地址的原因是因为要在函数里修改main函数必须通过地址进行
    List newNode = (List)malloc(sizeof(ListNode));
    newNode->Coefficient = coef;
    newNode->Exponent = expo;
    (*rear)->Next = newNode;
    (*rear) = (*rear)->Next;
    (*rear)->Next = NULL;
}
/*用到尾插法构造链表的函数*/
List CreateList(int degree) {
    List dummyHead = (List)malloc(sizeof(ListNode)); //多项式虚拟头结点
    List rear = dummyHead;
    rear->Next = NULL;
    for(int i = 0; i < degree; i++) {  //创建多项式链表
        int coef, expo;
        scanf("%d %d", &coef, &expo);
        if(coef == 0) continue;
        Attach(coef, expo, &rear);
    }
    return dummyHead;
}


/*打印链表*/
void PrintList(List L) {
    List ptr = L->Next;
    if(ptr == NULL) printf("0 0");
    while(ptr) {
        printf("%d %d", ptr->Coefficient, ptr->Exponent);
        if(ptr->Next) printf(" ");
        ptr = ptr->Next;
    }
    return;
}
/*删除链表*/
void DeleteList(List L) {
    List ptr = L->Next;
    while(ptr) {
        List tmp = ptr;
        ptr = ptr->Next;
        free(tmp);
    }
    free(L);
    return;
}
/*多项式加法,参数是两个链表头指针,不能操作传进来的链表*/
List AddPolynomial(List L1, List L2) {
    List dummyHead = (List)malloc(sizeof(ListNode));
    dummyHead->Next = NULL;
    List rear = dummyHead, ptr1 = L1->Next, ptr2 = L2->Next;
    while(ptr1 && ptr2) {
        int expo1 = ptr1->Exponent, expo2 = ptr2->Exponent;
        int coef1 = ptr1->Coefficient, coef2 = ptr2->Coefficient;
        if(expo1 > expo2) {
            Attach(coef1, expo1, &rear);
            ptr1 = ptr1->Next;
        }
        else if(expo1 < expo2) {
            Attach(coef2, expo2, &rear);
            ptr2 = ptr2->Next;
        }
        else {
            if((coef1 + coef2)) {
                Attach(coef1 + coef2, expo1, &rear);
            }
            ptr1 = ptr1->Next;
            ptr2 = ptr2->Next;
        }
    }
    
    if(ptr1) {
        while(ptr1) {
            Attach(ptr1->Coefficient, ptr1->Exponent, &rear);
            ptr1 = ptr1->Next;
        }
    }
    if(ptr2) {
        while(ptr2) {
            Attach(ptr2->Coefficient, ptr2->Exponent, &rear);
            ptr2 = ptr2->Next;
        }
    }
    return dummyHead;
}
/*多项式乘法,参数是两个链表头指针,不能操作传进来的链表*/
List ProductPolynomial(List L1, List L2) {
    List dummyHead = (List)malloc(sizeof(ListNode));
    List ptr0 = dummyHead, ptr1 = L1->Next, ptr2 = L2->Next;
    ptr0->Next = NULL;
    while(ptr2) {  
        int polyCoef2 = ptr2->Coefficient, polyExpo2 = ptr2->Exponent;
        List dummyHeadTmp = (List)malloc(sizeof(ListNode));
        List ptrTmp = dummyHeadTmp;
        ptrTmp->Next = NULL;
        while(ptr1) {   //将L2的每一项取出来,与L1相乘,得到一条tmp多项式链表
            int polyCoef1 = ptr1->Coefficient, polyExpo1 = ptr1->Exponent;
            int polyCoefTmp = polyCoef1 * polyCoef2;
            int polyExpoTmp = polyExpo1 + polyExpo2;
            if(polyCoefTmp == 0) continue;
            Attach(polyCoefTmp, polyExpoTmp, &ptrTmp);
            ptr1 = ptr1->Next;
        }
        dummyHead = AddPolynomial(dummyHead, dummyHeadTmp); //将这条tmp链表累加到结果链表上即可得到多项式乘法结果
        DeleteList(dummyHeadTmp);   //释放tmp链表
        ptr1 = L1->Next;            //将ptr1重新指向L1
        ptr2 = ptr2->Next;          //ptr2指向L2的下一项
    }
    return dummyHead;
}
int main() {
    int degree1;
    scanf("%d", &degree1);
    List polynomial1 = CreateList(degree1);
    int degree2;
    scanf("%d", &degree2);
    List polynomial2 =  CreateList(degree2);
    List polynomialAdd = AddPolynomial(polynomial1, polynomial2);
    List polynomialPtrduct = ProductPolynomial(polynomial1, polynomial2);
    PrintList(polynomialPtrduct);
    printf("\n");
    PrintList(polynomialAdd);
    DeleteList(polynomial1);
    DeleteList(polynomial2);
    DeleteList(polynomialAdd);
    return 0;
}

到了这里,关于浙大数据结构第二周02-线性结构2 一元多项式的乘法与加法运算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://blog.csdn.net/m0_72805195/article/details/131584311

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包