----------------2023.8.23---------------
线性表的常见算法包括对顺序表和对链表的,本篇文章主要对单链表常见算法或题型进行讨论。
1.多项式的运算
对于多项式的运算,我们可以分为稠密多项式和稀疏多项式,二者的差距在于未知数x的指数分布情况,当指数分布情况稠密时,可以直接通过数组进行存储,将数组下标于指数进行一一对应,数组值于未知数系数对应,再完成相应操作即可;当指数分布过于稀疏,显然不实用于数组,于是采用链表进行存储,存储结构如下所示。
typedef struct PNode{
float coef; //系数
int expn; //指数
struct PNode *next;//指针域
}PNode,*Polynomial;
要实现多项式的相加,首先需要创建多项式。
1.1多项式的创建
多项式的创建实际与普通链表创建过程相似,但在创建时,需要对指数进行非递减的排序,所以每次插入新结点时,需要对插入位置进行一个选择。
void CreatePolyn(Polynomial &P,int n){
P = new PNode ;
P->next = NULL;
for(i =1;i<=n;i++){
s = new PNode;
cin>>s->coef>>s->expn;
pre = P;
q = P->next;
while(q && q->expn < s->expn){ //向后一直找到合适的位置
pre = q;
q = q->next;
}
s->next = q;
pre->next = s;
}
}
1.2 多项式的相加
创建完成两个多项式链表后,就可以进行加法运算了。在计算时,我们会遇到不同指数的项相加,我们就需要对相加的指数先进行判断,如果同次幂相加,系数相加完成后,需要判断当前次幂的系数是否为0,如果为0,则要将该结点删除;如果不同次幂,则无需加法操作,直接按照升幂排列,插入多项式中即可。
void AddPolyn(Polynomial &Pa,Polynomial &Pb){
p1 = Pa->next;p2 = Pb->next;
p3 = Pa;
while(p1&&p2){
//相加时,会有以下三种情况
if(p1->expn == p2->expn){
sum = p1->coef + p2->coef;
//相加后系数是否为0要分情况讨论
if(!sum){
p1->coef = sum;
p3->next = p1;p3 = p1;
p1 = p1->next;
r = p2;p2 = p2->next;delete r;//删除Pb当前结点
}else{
r = p1;p1=p1->next;delete r;
r = p2;p2=p2->next;delete r;
}
}
//按照升幂排列,所以p3应该指向指数更小的结点
else if(p1->expn < p2->expn){
p3->next = p1;
p3 = p1;
p1 = p1->next;
}
else{
p3->next = p2;
p3 = p2;
p2 = p2->next;
}
}
p3->next = p1? p1 : p2;
delete Pb;
}