[线性表]一元多项式相乘

本文详细探讨了一元多项式的相乘算法,重点介绍了如何利用链表数据结构高效地实现这一操作。通过实例解释了如何将两个一元多项式表示为链表,并展示相乘的具体步骤,包括节点合并和系数计算。对于理解和实现一元多项式乘法提供了清晰的指导。
摘要由CSDN通过智能技术生成

 

/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{   int    coef, exp;           //coef:系数     exp:指数
    struct node  *next;         //下一项
} NODE;

NODE* multiplication( NODE *, NODE * , NODE * );
void input( NODE * );
void output( NODE * );

int main()
{   NODE * head1, * head2, * head3;

    head1 = ( NODE * ) malloc( sizeof(NODE) );
    input( head1 );

    head2 = ( NODE * ) malloc( sizeof(NODE) );
    input( head2 );

    head3 = ( NODE * ) malloc( sizeof(NODE) );
    head3->next = NULL;
    head3 = multiplication( head1, head2, head3 );
	output( head3 );

	return 0;
}
/* PRESET CODE END - NEVER TOUCH CODE ABOVE */
void input( NODE * head )      //输入顺序:<   -   0~9   ,    >
{   int flag, sign, sum, x;    //sign:系数符号     sum:项系数,指数
	char c;

    NODE * p = head;

	while ( (c=getchar()) !='\n' )
	{
		if ( c == '<' )
	    {    sum = 0;
	         sign = 1;
	         flag = 1;
        }
		else if ( c =='-' )
             sign = -1;
		else if( c >='0'&& c <='9' )
		{    sum = sum*10 + c - '0';
        }
		else if ( c == ',' )
        {    if ( flag == 1 )
             {    x = sign * sum;
                  sum = 0;
                  flag = 2;
                  sign = 1;
             }
        }
		else if ( c == '>' )
        {    p->next = ( NODE * ) malloc( sizeof(NODE) );
             p->next->coef = x;							//项系数
             p->next->exp  = sign * sum;				//指数
             p = p->next;
             p->next = NULL;
             flag = 0;
        }
    }
}
void output( NODE * head )
{
    while ( head->next != NULL )
    {   head = head->next;
        printf("<%d,%d>,", head->coef, head->exp );
    }
    printf("\n");
}
NODE* multiplication( NODE *h1, NODE *h2 , NODE *h3 )//不允许修改指针内容
{
	NODE *head1, *head2, *head3,*head;//head临时头指针
	int max_exp = 0,count_exp = 0;
	head1 = h1;
	head2 = h2;
	head3 = h3;
	while(head1->next!=NULL){
		while(head2->next!=NULL){
			head3->next = (NODE *) malloc(sizeof(NODE));
			head3->next->coef = head1->next->coef*head2->next->coef;
			head3->next->exp = head1->next->exp+head2->next->exp;
			head2 = head2->next;
			head3 = head3->next;
			head3->next = NULL;
			if(head3->exp>max_exp)            //记录最大指数
                max_exp = head3->exp;
		}
		head2 = h2;      //返回头指针
		head1 = head1->next;
	}
    //合并指数相同的多项式
	head = (NODE *)malloc(sizeof(NODE));
	head->next = (NODE*)malloc(sizeof(NODE));
	head3 = h3;             //返回头指针
	head1 = head;
	for(count_exp = 0;count_exp<=max_exp;count_exp++){
        head->next->coef = 0;
        head->next->exp = count_exp;
        while(head3->next!=NULL){
            if(count_exp == head3->next->exp)
                head->next->coef += head3->next->coef;
            head3 = head3->next;
        }
        //零多项式标志位
        if(head->next->coef != 0){
            head = head->next;
            head->next = (NODE*)malloc(sizeof(NODE));
        }
		head3 = h3;             //返回头指针
	}
	head->next = NULL;
	return head1;
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值