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
    评论
采用C语言链表实现多项式相乘的基本思路是将两个多项式分别表示为链表的形式,然后按照多项式相乘的规则进行计算,并将结果保存在一个新的链表中。 具体实现步骤如下: 1. 定义一个结构体来表示多项式的每一项,包括系数和指数。 ```c typedef struct Node { int coefficient; // 系数 int exponent; // 指数 struct Node* next; // 指向下一个节点的指针 } Node; ``` 2. 创建两个链表,分别表示两个多项式,并初始化为空链表。 ```c Node* poly1 = NULL; // 第一个多项式链表 Node* poly2 = NULL; // 第二个多项式链表 ``` 3. 分别读取两个多项式的系数和指数,并将其插入到对应的链表中。 ```c // 插入节点到链表中 void insertNode(Node** head, int coefficient, int exponent) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->coefficient = coefficient; newNode->exponent = exponent; newNode->next = NULL; if (*head == NULL) { *head = newNode; } else { Node* temp = *head; while (temp->next != NULL) { temp = temp->next; } temp->next = newNode; } } // 读取多项式的系数和指数,并插入到链表中 void readPolynomial(Node** head) { int coefficient, exponent; int numTerms; printf("请输入多项式的项数:"); scanf("%d", &numTerms); for (int i = 0; i < numTerms; i++) { printf("请输入第%d项的系数和指数:", i + 1); scanf("%d %d", &coefficient, &exponent); insertNode(head, coefficient, exponent); } } // 读取第一个多项式 printf("请输入第一个多项式:\n"); readPolynomial(&poly1); // 读取第二个多项式 printf("请输入第二个多项式:\n"); readPolynomial(&poly2); ``` 4. 定义一个函数来实现多项式相乘的操作,并返回结果链表。 ```c // 多项式相乘 Node* multiplyPolynomials(Node* poly1, Node* poly2) { Node* result = NULL; // 结果链表 // 遍历第一个多项式的每一项 Node* temp1 = poly1; while (temp1 != NULL) { // 遍历第二个多项式的每一项 Node* temp2 = poly2; while (temp2 != NULL) { // 计算相乘后的系数和指数 int coefficient = temp1->coefficient * temp2->coefficient; int exponent = temp1->exponent + temp2->exponent; // 在结果链表中插入相乘后的项 insertNode(&result, coefficient, exponent); temp2 = temp2->next; } temp1 = temp1->next; } return result; } // 调用多项式相乘函数 Node* result = multiplyPolynomials(poly1, poly2); ``` 5. 最后,遍历结果链表并输出相乘后的多项式。 ```c // 遍历链表并输出多项式 void printPolynomial(Node* head) { Node* temp = head; while (temp != NULL) { printf("%dx^%d ", temp->coefficient, temp->exponent); if (temp->next != NULL) { printf("+ "); } temp = temp->next; } printf("\n"); } // 输出相乘后的多项式 printf("相乘后的多项式为:"); printPolynomial(result); ``` 以上就是采用C语言链表实现多项式相乘的基本步骤。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值