期末复习——一元多项式的表示及运算

一个一元多项式pn(x)可按升幂的形式写成:
pn(x) = p0+p1X+p2X2+p3X3+…+pnXn
可以用线性表存储:(p0,p1,p2,…,pn

例:2+x5+10x100
可以只存储非0项,用单链表存储多项式的结点结构:

typedef struct Polynode{
	int coef; 
	int exp; 
	Polynode *next;
}Polynode,*Polylist;

两个多项式相加

A(x) = 7+3x+9x8+5x17
B(x) = 8x+22x7-9x8

在这里插入图片描述
定义两个指针p,q分别指向两个多项式的第一个元素,判断p,q指向的指数域是否相同,相同就是同类项,系数加起来,然后释放另一个表里的同类项,没有同类项的直接插入到尾结点的位置。

在这里插入图片描述

  • 若p->exp < q->exp,则结点p所指的结点应是“和多项式”中的一项,令指针p后移;
  • 若p->exp = q->exp,则将两个结点中的系数相加,当和不为零时修改结点p的系数域,释放q结点;若和为零,则和多项式中无此项,从A中删去p结点,同时释放p和q结点;
  • 若p->exp > q->exp,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。

算法实现

输入多项式的系数和指数,用尾插法建立一元多项式的链表。

Polylist polycreate(){
	Polynode *head,*rear,*s; 
	int c,e; 
	rear=head=(Polynode *)maloc(sizeof(Polynode)); 
	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);
}

两个多项式相加

void polyadd(Polylist polya,Polylist polyb){
	.../*p和q分别指向polya和polyb链表中的当前计算结点*V*/
	.../*rear指向和多项式链表中的尾结点*/
	while(p!=NULL&&q!=NULL)
	{
		if(p->exp<q->exp)
		{.../*将p结点加入到和多项式中*/)}
		else if(p->exp==q->exp)
		{.../*若指数相等,则相应的系数相加。
		若系数为0则删除p,q节点*/}
		else
		{.../*将q结点加入到和多项式中*/}
	}
	/*将多项式polya或polyb中剩余的结点加入到和多项式中*/
}

猜你喜欢

转载自blog.csdn.net/ITmincherry/article/details/106706712
今日推荐