C语言实现多项式相乘

将该代码插入上一篇文章中:数据结构与算法分析(C语言)多项式相加_400分的好苗子的博客-CSDN博客

//多项式相乘
LinkList mulList(LinkList L1, LinkList L2) {
    LinkList L;
    L = (LinkList)malloc(sizeof(Node));
    float arrayL1[100] = { 0 }, arrayL2[100] = { 0 }, arrayR[100] = { 0 };
    int len1, len2,i,j,maxL1,maxL2,minL1,minL2;
    Node* r1, * r2,*p,*q,*s,*r = L;
    r1 = L1->next;
    r2 = L2->next;
    p = L1->next;
    q = L2->next;
    len1 = getLen(L1);
    len2 = getLen(L2);
    //因为上次的链表已经经过从大到小的排序,所以第一个数的下标记为最大指数
    maxL1 = r1->index;//记录L1的最大指数
    maxL2 = r2->index;//记录L2的最大指数
    for (i = 0; i < len1; i++) {//将数组中的值记为0
        arrayL1[i] = 0;
    }
    for (i = 0; i < len2; i++) {
        arrayL2[i] = 0;
    }
    for (i = 0; i < len1 + len2; i++) {
        arrayR[i] = 0;
    }
    //将数组中的值记为0的意义在于,当相对的只数不存在时,系数是0,使程序不会报错

    while (r1 != NULL) {
        i = r1->index;
        arrayL1[i] = r1->coef;
        r1 = r1->next;
    }
    while (p->next != NULL) {
        p = p->next;
    }
    minL1 = p->index;//记录L1最小下标
    while (r2 != NULL) {
        i = r2->index;
        arrayL2[i] = r2->coef;
        r2 = r2->next;
    }
    while (q->next != NULL) {
        q = q->next;
    }
    minL2 = q->index;//记录L2最小下标
    for (i = minL1; i <= maxL1; i++) {
        for (j = minL2; j <= maxL2; j++) {
            arrayR[i + j] = arrayL1[i] * arrayL2[j];
        }
    }
    for (i = minL1+minL2; i <= maxL1+maxL2; i++) {
        s = (Node*)malloc(sizeof(Node));
        s->index = i;
        s->coef = arrayR[i];
        r->next = s;
        r = s;
    }
    return L;
}

思路仍然是将链表先转化并存储到数组当中。

主函数:

int main()
{
    LinkList L1, L2,List1,List2,L;
    LinkList R1, R2;
    L1 = LinkListInit();
    L2 = LinkListInit();
    printf("请输入第一个链表的指数和系数:\n");
    List1 = createList(L1);
    printf("请输入第二个链表的指数和系数:\n");
    List2 = createList(L2);
    //L = addList(R);
    sortList(List1);
    sortList(List2);
    //将R1,R2进行行列式相加,防止出现重复的指数
    R1 = addList(List1);
    R2 = addList(List2);
    //将链表进行排序
    sortList(R1);
    sortList(R2);
    L = mulList(R1, R2);
    printLinkList(L);
	return 0;
}

为了方便运算,我将链表进行了从大到小的排序,从而默认第一个数的指数最大,所以在传参时不要忘记先用sortList函数对链表进行排序,不然函数运行时会报错。

运行结果图:

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值