第二讲线性结构
2.4应用实例
多项式加法运算
实现思路
实现方法
采用不带头结点的单向链表,按照指数递减的顺序排列各项
- 具体的数据结构的结构类型的定义
struct PloyNode{
int coef; //系数
int expon; //指数
struct PloyNode *link; //指向下一个结点的指针
};
typedef struct PloyNode *Ploynomial;
Ploynomial P1, P2;
- 设计一个函数,函数参数是传入两个多项式
Polynomial PolyAdd(Polynomial P1, Polynomial P2) //参数为两个指针,分别指向两个多项式
{
Polynomial front, rear, temp; //结果多项式的头和尾的指针
int sum;
rear=(Polynomial)malloc(sizeof(struct PolyNode)); //构造一个临时空结点,作为结果多项式的表头
front=rear; //由front记录结果多项式链表头结点
while(P1&&P2){ //当两个多项式都有非零项待处理时
switch(Compare(P1->expon, P2->expon)){ //Compare函数比较P1,P2所指向的当前这个项的指数
case 1: //P1所指向的当前项的指数大
Attach(P1->coef, P1->expon, &rear); //把P1指向的当前项的指数拷贝过去
P1=P1->link; //P1往后挪
break;
case -1: //P2所指向的当前项的指数大
Attach(P2->coef, P2->expon, &rear); //Attach(coef(系数), expon(指数),形成的新的项接到rear后面)
P2=P2->link;
break;
case 0: //P1,P2所指向的当前项的指数一样大
sum = P1->coef+P2->coef; //把两个项相加的系数赋给sum
if(sum)Attach(sum, P1->expon, &rear); //if(sum)判断sum是否为0,if(sum)是不为0
//如果不为0,把sum作为系数,跟对应指数凑到一起接到rear后面去
P1=P1->link;
P2=P2->link; //P1,P2都往后挪
}
}
//当循环做完代表P1/P2有一个为空了
//将未处理完的另外一个多项式的所有结点一次复制到结果多项式中去
//第一个for循环,处理P1不空
for(; P1; P1=P1->link)Attach(P1->coef, P1->expon, &rear);
//第二个for循环,处理P2不空
for(; P2; P2=P2->link)Attach(P2-<coef, P2->expon, &rear);
rear->link=NULL; //加完了,最后一项没了
temp=front; //为了释放临时空结点
front=front->link; //front原来指向临时的表头结点,表头结点的下一项就是真正多项式的第一项
free(temp); //释放临时空表头结点
return front;
}
- Attach函数具体的实现方法
//Attach函数的实现
//三个参数传进来(系数,指数,当前最后一个结点的指针位置)
//*pRear是指针的指针
void Attach(int c, int e, Polynomial *pRear)
{
Ploynomial P;
P=(Ploynomial)malloc(sizeof(struct PolyNode));
//通过malloc申请结点结点类型为struct PolyNode这个类型
P->coef=c; //对新结点赋值
P->expon=e;
P->link=NULL;
(*pRear)->link=P;
*pRear=P; //修改pRear值
}