线性表的应用——一元多项式的表示及相加
对于一元多项式,可以用线性表来处理,可以采用顺序存储或者是链式存储
(一)一元多项式的顺序存储表示
1>.一元多项式Pn(x)只存储该一元多项式各项的系数,每个系数所对应的指数项则隐含在存储系数的顺序表的下标中。即p[0]存系数p0,对应为的系数。p[n]对应存系数pn,对应为
的系数。采用这种存储方式简单,再进行一元多项式的相加运算的时候,只需要将下标相同的单元内容相加即可,适合于存储非零系数多的多项式。但是对于非零项指数很高并且非零项很少的一元多项式会浪费很多的空间。
2>.只存储非零项,此时只需要存储非零项系数和非零项指数两部分,适合存储非零项少的多项式。
(二)一元多项式的链式存储表示
结点结构定义如下:
typedef struct polynode{
int coef; //系数
int exp;//指数
struct polynode *next;
} polynode,*polylist;
通过键盘输入一组多项式的系数和指数,用尾插法建立一元多项式的链表。输入系数0为结束标志,并约定建表时,总是按照从小到大的顺序排列。
polylist ploycreate(){
polynode *head,*rear,*s;
int c,e;
head=(polynode*)malloc(sizeof(polynode));
rear=head;
scanf("%d,%d",&c,%e);
while(c!=0){
s=(polynode*)malloc(sizeof(polynode));
s->coef=c;
s->exp=e;
rear->next=s;
rear=s;
scanf("%d,%d",&c,%e);
}
rear->next=NULL;
return(head);
}
(三)一元多项式的链式相加运算
算法思想:单链表polya和polyb分别表示一元多项式A和B,A+B的求和运算就等同于单链表的插入问题。设p、q分别为指向单链表polya和polyb的当前项的指针,比较p、q结点的指数项,可得到规则:
1、如果p->exp<q->exp,则结点p所指的应该是“和多项式”中的一项,另指针p后移。
2、如果p->exp=q->exp,则将两个节点中的系数相加,当和不为零的时候修改结点p的系数域,释放q结点,若和为零则和多项式没有此项,从polya中删除p结点,同时释放p和q结点。
3、若p->exp>q->exp,则结点q所指应该是“和多项式”中的一项,将q插入到结点p之前,且令指针q在原来链表上后移。
void polyAdd(polilist polya,polylist polyb){
polynode *p,*q,*tail,*temp;
int sum;
p=polya->next;
q=polyb->next;
tail=polya; //tail指向和多项式的尾结点
while(p!=NULL&&q!=NULL){
if(p->exp<q->exp){
tail->next=p;
tail=p;
p=p->next'
}
else if(p->exp==q->exp){
sum=p->coef+q->coef;
if(sum!=0){
p->coef=sum;
tail->next=p;
tail=p;
p=p->next;
temp=q;
q=q->next;
free(temp);
}
else{
temp=p;p=p->next;free(temp);
temp=q;q=q->next;free(temp);
}
}
else{
tail->next=tail;tail=q;q=q->next;
}
if(p!=NULL) //多项式A中还有剩余,则将剩余结点加到和多项式中
tail->next=p;
else //多项式B中还有剩余,则将剩余结点加到和多项式中
tail->next=q;
}