/*:--------------一元稀疏多项式计算(部分)--------------*
基本功能:
(1)输入并建立多项式;
(2)多项式输出,以 c1,e1,c2,e2,...输出
其中ci为系数,ei为指数;
(3)多项式相加,c=a+b。
说明:(1)多项式一指数升序排序,但输入时不检查 (2)以带头指针的单链表存储。
*-------------------------------------------------------*/
#define OK 1
#define FAILE 0
#define ERROR 0
#define OVERFLOW 0
#include
using namespace std;
typedef struct PolynNode { /*某一项*/
double coef; /*系数*/
int expn; /*指数*/
} ElemType,term;
typedef struct LNode {
ElemType data;
struct LNode *next;
}LNode,*LinkList;
typedef LinkList Polyn; /*带头结点*/
int init_polyn(Polyn head,int n)
{
/*创建有n项的多项式,n应大于0,但不作检查*/
/*指数e1
Polyn p,q = head;
double coef;
int expn,count=0;
if(head == NULL)
return ERROR;
if((p = (Polyn)malloc(sizeof(LNode))) == NULL)
return OVERFLOW;
printf("Please input n pairs of coef and expn.\n");
for(count = 0;count < n;count++) {
q->next = p;
q = p;
scanf("%f%d",&coef,&expn);
p->data.coef = coef;
p->data.expn = expn;
if((p = (Polyn)malloc(sizeof(LNode))) == NULL)
return OVERFLOW;
}
q->next = NULL;/*尾*/
return OK;
}
int print_polyn(Polyn head)
{
/*输出*/
Polyn p=head->next;
int count=0;
if(head == NULL)
return ERROR;
while(p != NULL) {
printf("%.4f %3d",p->data.coef,p->data.expn);
count++;
if((count % 10 == 0) && (!count))
printf("\n");
p = p->next;
}
printf("\n");
return OK;
}
int add_polyn(Polyn ha,Polyn hb,Polyn hc)
{
/*多项式相加*/
Polyn p1 = ha,p2 = ha,q1 = hb,q2 = hb;
hc = ha;
while( (p1 != NULL) && (q1 != NULL)) {
if(p1->data.expn < q1->data.expn) { /*p1指数
p2 = p1;
p1 = p1->next;
}
else {
if(p1->data.expn == q1->data.expn) { /*q1指数==p1指数*/ if(!(p1->data.coef + q1->data.coef)) {/*系数之和为0*/ p1 = p1->next; free(p2->next); p2->next = p1; q1 = q1->next; free(q2->next); q2->next =q1; } else { /*系数之和不为0*/ p1->data.coef += q1->data.coef; p2 = p1; p1 = p1->next; q1 = q1->next; free(q2->next); q2->next =q1; }
}
else { /*q1指数next = q1; q1->next = p1; p2 = p2->next; q1 = q1->next; q2->next = q1;
}
}
}
if(p1 == NULL) { /*p1结束了,q1未结束*/
p2->next = q1;
}
ha->next = NULL;
free(ha);
free(hb);
return OK;
}
int main()
{
int creat_polyn(Polyn head);
int init_polyn(Polyn head,int n);
int print_polyn(Polyn head);
int add_polyn(Polyn ha,Polyn hb,Polyn hc);
LNode polyn1,polyn2;
Polyn ha = &polyn1,hb = &polyn2,hc;
int n;
printf("How many terms do you want to initial the polynomial ha? Input a number.\n");
scanf("%d",&n);
init_polyn(ha,n);
print_polyn(ha);
printf("How many terms do you want to initial the polynomial hb? Input a number.\n");
scanf("%d",&n);
init_polyn(hb,n);
print_polyn(hb);
add_polyn(ha,hb,hc);
print_polyn(hc);
return 0;
}