/* 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;
}