2.3链表的应用
2.3.1一元多项式的存储
2.3.1.1定义
typedef struct Polynode {
int coef;//系数
int exp;//指数
struct Polynode *next;//指针域
}Polynode , * Polylist;
2.3.1.2尾插法建表
Polylist polycreate( ) {
rear=head=(Polynode *)malloc(sizeof(Polynode)); //分配头结点
scanf(“%d,%d”,&c,&e); //首元结点的系数c,和指数e
while(c!=0) { //默认输入系数为0时,结束循环(结束建立新的多项式结点)
s=(Polynode*)malloc(sizeof(Polynode));//分配空间
s->coef=c; s->exp=e;
rear->next=s; rear=s; //尾指针指向新插入的结点s
scanf(“%d,%d”,&c,&e); }//继续插入下一个多项式结点
rear->next=NULL; return(head);
}
2.3.2一元多项式求导
void derivat_poly( Polylist pa ){
pre=pa; //pre便于删除常数项
p=pa->next; //p用于完成当前结点求导操作
while(p)
if(p->exp==0) //删除常数项
{ pre->next=p->next;
free(p); p=pre->next; }
else { p->coef*=p->exp; p->exp--;
pre=p;//不能丢
p=p->next; }
}
2.3.3一元多项式相加
//相加结果存到pa里面
void add_poly( Polylist pa, Polylist pb ){
p=pa->next; q=pb->next; pre=pa;//有了pre方便很多操作
while(p&&q){
if(p->exp<q->exp){ pre->next=p; pre=p; p=p->next; }
else if(p->exp>q->exp){ pre->next=q;pre=q;q=q->next; }
else{ //两结点指数域相同则系数相加
sum=p->coef+q->coef;
if(sum!=0)
{ p->coef=sum; pre->next=p;pre=p;p=p->next; }
else { temp=p; p=p->next; free(temp); }//引入temp指针删除相加后系数为0的结点
temp=q; q=q->next; free(temp);//释放用不到的q结点
}
//把剩余结点链接到pre后面
if(q!=NULL) pre->next=q; else pre->next=p;
free(pb);
}