#include <stdio.h>
#include <stdlib.h>
#include<iostream>
//using namespace std;
struct list{
int coef;
int expon;
struct list * next;
} ;
typedef struct list node;
typedef node * link;
void createpoly( link * ptr) ;
link mul( link poly1, link poly2) ;
link add( link poly1, link poly2) ;
int compare( int , int ) ; // 比較兩多項式的指數大小
void attach( int , int , link * ptr) ; // 將一個節點附加在串列的結尾
void printfresult( link ) ;
link freelist( link temp ) ;
int main( )
{
link * ptr= NULL;
link poly1 = NULL; // intially there are no nodes
link poly2 = NULL;
link answer = NULL; // 放置多項式的運算結果
link temp;
//input polynomial 1
printf ( "Enter the polynomial 1: " ) ; createpoly( & poly1) ;
//input polynomial 2
printf ( "Enter the polynomial 2: " ) ; createpoly( & poly2) ;
answer = mul( poly1, poly2) ;
printfresult( answer) ;
}
void createpoly( link * ptr)
{
link head= NULL; // pointer to head
link current; // pointer to current
int coef, expon ;
int sign = 1 ;
char token ;
do {
scanf ( "%d" , & coef
) ; // 接收係數 scanf ( "%d" , & expon
) ; // 接收指數 scanf ( "%c" , & token
) ; // 接收下一項的正負號
if ( ! head ) { // 如head為NULL時
head
= ( node
* ) malloc ( sizeof ( node
) ) ; //creat node head-> coef = coef * sign; // place 係數值 in node
head-> expon = expon; // place 指數值 in node
head-> next = NULL; // node does not link to another node
}
else {
current = head; // 指到串列之首
while ( current-> next != NULL ) { // 此while是在找串列的最後一個節點 就是current->next 為 NULL時
current = current-> next;
}
current
-> next
= ( node
* ) malloc ( sizeof ( node
) ) ; // 在串列最後再creat一個node current-> next-> coef = coef * sign ; // place 係數值 in node
current-> next-> expon = expon; // place 指數值 in node
current-> next-> next = NULL; // node does not link to another node
}
// 判定下一項的正負號
if ( token == '+' ) // 如為正
sign = 1 ;
else if ( token == '-' ) // 如為負
sign = - 1 ;
} while ( token != '\n ' ) ; // 當token為enter時就結束while
* ptr = head; // head assign 給*sptr 指到串列之首
}
// 多項式的加法
link add( link poly1, link poly2)
{
link front , rear, temp;
int sum;
rear
= ( node
* ) malloc ( sizeof ( node
) ) ; //creat node front = rear;
while ( poly1, poly2 )
switch ( compare( poly1-> expon, poly2-> expon ) ) {
case - 1 : // poly1->expon 小於 poly2->expon
attach( poly2-> coef, poly2-> expon, & rear) ;
poly2 = poly2-> next;
break ;
case 0 : // poly1->expon 等於 poly2->expon
sum = poly1-> coef + poly2-> coef ;
if ( sum )
attach( sum, poly1-> expon, & rear) ;
poly1 = poly1-> next;
poly2 = poly2-> next;
break ;
case 1 : // poly1->expon 大於 poly2->expon
attach( poly1-> coef, poly1-> expon, & rear) ;
poly1 = poly1-> next;
break ;
}
/*copy rest of list head1 and then head2*/
for ( ; poly1 ; poly1 = poly1-> next)
attach( poly1-> coef, poly1-> expon, & rear) ;
for ( ; poly2 ; poly2 = poly2-> next)
attach( poly2-> coef, poly2-> expon, & rear) ;
rear-> next = NULL;
/* delete extra initial node */
temp = front;
front = front-> next;
return front;
}
link mul( link poly1, link poly2)
{
link temp = NULL , sum = NULL;
link first;
int coef , expon;
first = poly1;
while ( poly2 != NULL) {
while ( poly1 != NULL) {
coef = ( poly1-> coef) * ( poly2-> coef) ;
expon = ( poly1-> expon) * ( poly2-> expon) ;
attach( coef, expon, & temp ) ; // 將一個節點附加在串列的結尾
poly1 = poly1-> next; // poly1 下一個節點
}
sum = add( temp, sum) ;
poly2 = poly2-> next;
poly1 = first; // poly1 回到最首項
temp = freelist( temp) ; // 釋回節點串列空間
}
return sum;
}
int compare( int a, int b)
{
if ( a < b) return - 1 ;
else if ( a > b) return 1 ;
else return 0 ;
}
// 將一個節點附加在串列的結尾
void attach( int coefficient , int exponent, link * ptr)
{
link temp;
temp
= ( node
* ) malloc ( sizeof ( node
) ) ; //creat node temp-> coef = coefficient ;
temp-> expon = exponent ;
( * ptr) -> next= temp;
* ptr = temp;
}
// 把運算之後的多項式printf出來
void printfresult( link node )
{
while ( node != NULL ) {
if ( node-> coef > 0 ) { // 係數為正時
printf ( "+%dx^%d" , node
-> coef
, node
-> expon
) ; }
else { // 係數為負時
printf ( "%dx^%d" , node
-> coef
, node
-> expon
) ; }
node = node-> next; // 到下一個node
}
}
// 釋回節點串列空間
link freelist( link head )
{
link temp;
while ( temp != NULL) {
temp = head-> next;
head = temp;
}
head = NULL;
return head;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGU8aW9zdHJlYW0+Ci8vdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBsaXN0ewoJaW50IGNvZWY7CglpbnQgZXhwb247CglzdHJ1Y3QgbGlzdCAqbmV4dDsKfTsKdHlwZWRlZiBzdHJ1Y3QgbGlzdCBub2RlOwp0eXBlZGVmIG5vZGUgKmxpbms7Cgp2b2lkIGNyZWF0ZXBvbHkobGluayAqcHRyKTsKbGluayBtdWwobGluayBwb2x5MSxsaW5rIHBvbHkyKTsgCmxpbmsgYWRkKGxpbmsgcG9seTEsbGluayBwb2x5Mik7CmludCBjb21wYXJlKGludCxpbnQpOyAgLy8g5q+U6LyD5YWp5aSa6aCF5byP55qE5oyH5pW45aSn5bCPCnZvaWQgYXR0YWNoKGludCxpbnQsbGluayAqcHRyKTsgIC8vIOWwh+S4gOWAi+evgOm7numZhOWKoOWcqOS4suWIl+eahOe1kOWwvgp2b2lkIHByaW50ZnJlc3VsdCggbGluayApOwpsaW5rIGZyZWVsaXN0KCBsaW5rIHRlbXAgKTsgCgppbnQgbWFpbigpCnsKICAgIGxpbmsgKnB0cj1OVUxMOwoJbGluayBwb2x5MSA9IE5VTEw7ICAvLyBpbnRpYWxseSB0aGVyZSBhcmUgbm8gbm9kZXMKCWxpbmsgcG9seTIgPSBOVUxMOwoJbGluayBhbnN3ZXIgPSBOVUxMOyAgLy8g5pS+572u5aSa6aCF5byP55qE6YGL566X57WQ5p6cCglsaW5rIHRlbXA7CgovL2lucHV0IHBvbHlub21pYWwgMSAKcHJpbnRmKCJFbnRlciB0aGUgcG9seW5vbWlhbCAxOiAiKTsKY3JlYXRlcG9seSgmcG9seTEpOwoKLy9pbnB1dCBwb2x5bm9taWFsIDIgCnByaW50ZigiRW50ZXIgdGhlIHBvbHlub21pYWwgMjogIik7CmNyZWF0ZXBvbHkoJnBvbHkyKTsKCgoJcHJpbnRmKCJBbnN3ZXIgXG4iKTsKICAgIGFuc3dlciA9IG11bChwb2x5MSxwb2x5Mik7CglwcmludGZyZXN1bHQoYW5zd2VyKTsKCglzeXN0ZW0oInBhdXNlIik7Cgp9CnZvaWQgY3JlYXRlcG9seShsaW5rICpwdHIpCiAgICAgewoJbGluayBoZWFkPU5VTEw7ICAvLyBwb2ludGVyIHRvIGhlYWQKCWxpbmsgY3VycmVudDsgICAgLy8gcG9pbnRlciB0byBjdXJyZW50CgoJaW50IGNvZWYsZXhwb24gOwoJaW50IHNpZ24gPSAxIDsKCWNoYXIgdG9rZW4gOwoKCWRvIHsKCQlzY2FuZigiJWQiLCAmY29lZiApOyAgIC8vIOaOpeaUtuS/guaVuAoJCWdldGNoYXIoKTsgICAgICAgICAgICAgIC8vIOaOpeaUtiBeCgkJc2NhbmYoIiVkIiwgJmV4cG9uICk7ICAvLyDmjqXmlLbmjIfmlbgKCQlzY2FuZigiJWMiLCAmdG9rZW4gKTsgIC8vIOaOpeaUtuS4i+S4gOmgheeahOato+iyoOiZnwoKCQlpZiggIWhlYWQgKXsgIC8vIOWmgmhlYWTngrpOVUxM5pmCCgkJCWhlYWQgPShub2RlKiltYWxsb2MoIHNpemVvZiAoIG5vZGUgKSk7ICAvL2NyZWF0IG5vZGUKCQkJaGVhZC0+Y29lZiA9IGNvZWYgKiBzaWduOyAvLyBwbGFjZSDkv4LmlbjlgLwgaW4gbm9kZQoJCQloZWFkLT5leHBvbiA9IGV4cG9uOyAgICAgIC8vIHBsYWNlIOaMh+aVuOWAvCBpbiBub2RlCgkJCWhlYWQtPm5leHQgPSBOVUxMOyAgICAgICAgLy8gbm9kZSBkb2VzIG5vdCBsaW5rIHRvIGFub3RoZXIgbm9kZQoKCQkgICAgICAgICAgICAgICAgIH0KCQllbHNlewoJCQljdXJyZW50ID0gaGVhZDsgLy8g5oyH5Yiw5Liy5YiX5LmL6aaWCgkJCXdoaWxlKCBjdXJyZW50LT5uZXh0ICE9TlVMTCApeyAvLyDmraR3aGlsZeaYr+WcqOaJvuS4suWIl+eahOacgOW+jOS4gOWAi+evgOm7niDlsLHmmK9jdXJyZW50LT5uZXh0IOeCuiBOVUxM5pmCCgkJCQljdXJyZW50ID0gY3VycmVudC0+bmV4dDsKCQkJfQoJCQljdXJyZW50LT5uZXh0ID0gKG5vZGUgKiltYWxsb2MoIHNpemVvZiggbm9kZSkpOyAvLyDlnKjkuLLliJfmnIDlvozlho1jcmVhdOS4gOWAi25vZGUKCQkJY3VycmVudC0+bmV4dC0+Y29lZiA9IGNvZWYgKiBzaWduIDsgIC8vIHBsYWNlIOS/guaVuOWAvCBpbiBub2RlCgkJCWN1cnJlbnQtPm5leHQtPmV4cG9uID0gZXhwb247ICAgICAgICAvLyBwbGFjZSDmjIfmlbjlgLwgaW4gbm9kZQoJCQljdXJyZW50LT5uZXh0LT5uZXh0ID0gTlVMTDsJICAgICAgICAgLy8gbm9kZSBkb2VzIG5vdCBsaW5rIHRvIGFub3RoZXIgbm9kZQoJCX0KCiAgICAgICAgLy8g5Yik5a6a5LiL5LiA6aCF55qE5q2j6LKg6JmfCgkJaWYoIHRva2VuID09ICcrJykgIC8vIOWmgueCuuatowoJCQlzaWduID0gMTsKCQllbHNlIGlmKCB0b2tlbiA9PSAnLScpICAvLyDlpoLngrrosqAKCQkJc2lnbiA9IC0xOwoKCX13aGlsZSggdG9rZW4gIT0gJ1xuJyk7ICAvLyDnlbZ0b2tlbueCumVudGVy5pmC5bCx57WQ5p2fd2hpbGUKCgkqcHRyID0gaGVhZDsgIC8vIGhlYWQgYXNzaWduIOe1pipzcHRyIOaMh+WIsOS4suWIl+S5i+mmlgoKCQp9CgoKLy8g5aSa6aCF5byP55qE5Yqg5rOVCmxpbmsgYWRkKGxpbmsgcG9seTEsbGluayBwb2x5MikKewoJbGluayBmcm9udCAsIHJlYXIsIHRlbXA7CglpbnQgc3VtOwoJcmVhciA9ICggbm9kZSAqKW1hbGxvYyggc2l6ZW9mKCBub2RlICkpOyAgLy9jcmVhdCBub2RlCglmcm9udCA9IHJlYXI7CgoKCXdoaWxlKCBwb2x5MSwgcG9seTIgKQoJCXN3aXRjaCggY29tcGFyZSggcG9seTEtPmV4cG9uLCBwb2x5Mi0+ZXhwb24gKSl7CgoJCWNhc2UgLTE6ICAvLyBwb2x5MS0+ZXhwb24g5bCP5pa8IHBvbHkyLT5leHBvbgoJCQlhdHRhY2goIHBvbHkyLT5jb2VmLCBwb2x5Mi0+ZXhwb24sICZyZWFyKTsKCQkJcG9seTIgPSBwb2x5Mi0+bmV4dDsKCQkJYnJlYWs7CgoJCWNhc2UgMDogIC8vIHBvbHkxLT5leHBvbiDnrYnmlrwgcG9seTItPmV4cG9uCgkJCXN1bSA9IHBvbHkxLT5jb2VmICsgcG9seTItPmNvZWYgOwoJCQlpZiggc3VtICkKCQkJCWF0dGFjaCggc3VtLCBwb2x5MS0+ZXhwb24sICZyZWFyKTsKCQkJcG9seTEgPSBwb2x5MS0+bmV4dDsKCQkJcG9seTIgPSBwb2x5Mi0+bmV4dDsKCQkJYnJlYWs7CgoJCWNhc2UgMTogIC8vIHBvbHkxLT5leHBvbiDlpKfmlrwgcG9seTItPmV4cG9uCgkJCWF0dGFjaCggcG9seTEtPmNvZWYsIHBvbHkxLT5leHBvbiwgJnJlYXIpOwoJCQlwb2x5MSA9IHBvbHkxLT5uZXh0OwoJCQlicmVhazsKCX0KCgkvKmNvcHkgcmVzdCBvZiBsaXN0IGhlYWQxIGFuZCB0aGVuIGhlYWQyKi8KCWZvciggOyBwb2x5MSA7IHBvbHkxID0gcG9seTEtPm5leHQpCgkJYXR0YWNoKCBwb2x5MS0+Y29lZiwgcG9seTEtPmV4cG9uLCAmcmVhcik7Cglmb3IoIDsgcG9seTIgOyBwb2x5MiA9IHBvbHkyLT5uZXh0KQoJCWF0dGFjaCggcG9seTItPmNvZWYsIHBvbHkyLT5leHBvbiwgJnJlYXIpOwoJcmVhci0+bmV4dCA9IE5VTEw7CgoJLyogZGVsZXRlIGV4dHJhIGluaXRpYWwgbm9kZSAqLwoJdGVtcCA9IGZyb250OwoJZnJvbnQgPSBmcm9udC0+bmV4dDsKCWZyZWUoIHRlbXAgKTsKCXJldHVybiBmcm9udDsKfQoKbGluayBtdWwobGluayBwb2x5MSxsaW5rIHBvbHkyKQp7CglsaW5rIHRlbXAgPSBOVUxMICwgc3VtID0gTlVMTDsKCWxpbmsgZmlyc3Q7CglpbnQgY29lZiAsIGV4cG9uOwoKCWZpcnN0ID0gcG9seTE7CiAgIAl3aGlsZShwb2x5MiAhPSBOVUxMKXsKCQl3aGlsZSggcG9seTEgIT0gTlVMTCl7CgkJCWNvZWYgPSAocG9seTEtPmNvZWYpICogKHBvbHkyLT5jb2VmKTsKCQkJZXhwb24gPSAocG9seTEtPmV4cG9uKSAqIChwb2x5Mi0+ZXhwb24pOwoJCQlhdHRhY2goIGNvZWYsIGV4cG9uLCAmdGVtcCApOyAgLy8g5bCH5LiA5YCL56+A6bue6ZmE5Yqg5Zyo5Liy5YiX55qE57WQ5bC+CgkJCXBvbHkxID0gcG9seTEtPm5leHQ7ICAvLyBwb2x5MSDkuIvkuIDlgIvnr4Dpu54KCQl9CgkJc3VtID0gYWRkKHRlbXAsc3VtKTsKCQlwb2x5MiA9IHBvbHkyLT5uZXh0OwoJCXBvbHkxID0gZmlyc3Q7ICAvLyBwb2x5MSDlm57liLDmnIDpppbpoIUKCQl0ZW1wID0gZnJlZWxpc3QodGVtcCk7ICAvLyDph4vlm57nr4Dpu57kuLLliJfnqbrplpMKCX0KCXJldHVybiBzdW07Cgp9CmludCBjb21wYXJlKGludCBhLGludCBiKQp7CglpZihhIDwgYikgICAgICAgcmV0dXJuIC0xOwogICAgZWxzZSBpZihhID4gYikgIHJldHVybiAxOwoJZWxzZSAgICAgICAgICAgICByZXR1cm4gMDsKfQoKLy8g5bCH5LiA5YCL56+A6bue6ZmE5Yqg5Zyo5Liy5YiX55qE57WQ5bC+CnZvaWQgYXR0YWNoKCBpbnQgY29lZmZpY2llbnQgLCBpbnQgZXhwb25lbnQsIGxpbmsgKnB0cikKewoJbGluayB0ZW1wOwoJdGVtcCA9IChub2RlKiltYWxsb2Moc2l6ZW9mKG5vZGUpKTsgIC8vY3JlYXQgbm9kZQoJdGVtcC0+Y29lZiA9IGNvZWZmaWNpZW50IDsKCXRlbXAtPmV4cG9uID0gZXhwb25lbnQgOwoJKCpwdHIpLT5uZXh0PXRlbXA7CgkqcHRyID0gdGVtcDsKfQoKLy8g5oqK6YGL566X5LmL5b6M55qE5aSa6aCF5byPcHJpbnRm5Ye65L6GCnZvaWQgcHJpbnRmcmVzdWx0KCBsaW5rIG5vZGUgKQp7Cgl3aGlsZSggbm9kZSAhPSBOVUxMICl7CgkJaWYobm9kZS0+Y29lZiA+IDAgKXsgIC8vIOS/guaVuOeCuuato+aZggoJCQlwcmludGYoICIrJWR4XiVkIiwgbm9kZS0+Y29lZiwgbm9kZS0+ZXhwb24pOwoJCX0KCQllbHNleyAgICAvLyDkv4LmlbjngrrosqDmmYIKCQkJcHJpbnRmKCIlZHheJWQiLCBub2RlLT5jb2VmLCBub2RlLT5leHBvbik7CgkJfQoJCW5vZGUgPSBub2RlLT5uZXh0OyAvLyDliLDkuIvkuIDlgItub2RlCgl9CglwcmludGYoICJcbiIgKTsKCn0KCi8vIOmHi+WbnuevgOm7nuS4suWIl+epuumWkwpsaW5rIGZyZWVsaXN0KCBsaW5rIGhlYWQgKQp7CglsaW5rIHRlbXA7CgoJd2hpbGUodGVtcCAhPSBOVUxMKXsKCQl0ZW1wID0gaGVhZC0+bmV4dDsKCQlmcmVlKGhlYWQpOwoJCWhlYWQgPSB0ZW1wOwoJfQoKCWhlYWQgPSBOVUxMOwoJcmV0dXJuIGhlYWQ7Cn0KCgo=