实现两个多项式进行相加 不开辟空间 ( 这要求实现进行相加,代价为两个原链表将被修改)
分析:
this>other 就把other当前结点放置在this之前
this<other 就this当前结点前移一位,并且后继也前移一位
this==other 求和为0就删除,并全部前移一位,不等就删除other中的当前结点并前移
注意:
必须注意 n 作为始终指向 mHead, n->next 始终指向other链表的下一个结点,所以修改了other链表时候必须注意 n->next的指向
有些书上 C语言实现的多项式之和,如果 修改对应的代码植入于C++中,能够得到正确结果,但是 C++ 的析构函数将会出错,故此要将 other 表中的指针 n 指向明确
void Link::Add( Node * mHead) {
Node * ph = Head->Next;
Node * pm = mHead->Next;
Node * m = Head; //作为一个标记,标记this上一次访问的结点
Node * n = mHead; // n 始终指向头结点,并且 n->next指向 pm 的下一个结点元素 while( ph!=NULL && pm!=NULL) { // 判断当 A 或 B 两个链表不为空时
if( ph->Index>pm->Index) { //this>other ,将other的第一个结点插入到 this当前结点之前
n->Next = pm->Next; // 让 n 的 next指针指向 pm的下一个结点,
m->Next = pm;
m = pm;
m->Next = ph;
pm = n->Next; // 上述将 pm 插入时,将 pm 指向下一个结点,即 n->enxt
}
else if( ph->Index<pm->Index) { //this<other 只需要将this的结点后移一位,注意 m 始终未 this的上一个结点
m = ph;
ph = ph->Next;
}
else { //this==other
Node * tem;
if( ph->Ratio+pm->Ratio==) { // 求和为0 将this的当前结点删除,并且后移一位
tem = ph;
ph = ph->Next;
Delete(tem);
}
else { //求和不为0, 将系数相加
ph->Ratio = ph->Ratio+pm->Ratio;
} // 当相等时,都要删除掉other的当前结点,并后移一位
tem = pm;
pm = pm->Next;
n->Next = pm; //
Delete(tem);
}
}
if( ph==NULL) { // 由于当other > this时,只将this后移,所以 pm 为空表示都插入进去,不为空时,
m->Next = pm; // 表示this的链表为空了,所以将other剩下的链表插入 this 的表尾,即 n 指向最后一个结点 n->next正好是表尾指针
n->Next = NULL; // 设置表尾为空
}
}
void Link::Delete(Node * tem) { // 删除结点 tem
delete tem;
}