实现两个多项式进行相加 不开辟空间 ( 这要求实现进行相加,代价为两个原链表将被修改)

分析:
    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;
}

    

两个多项式相加 ( C++ )的更多相关文章

  1. 【Weiss】【第03章】练习3.6:有序多项式相加

    [练习3.6] 编写将两个多项式相加的函数.不要毁坏输入数据.用一个链表实现. 如果这两个多项式分别有M项和N项,那么你程序的时间复杂度是多少? 两个按幂次升序的多项式链表,分别维护一个指针. 幂较小 ...

  2. MFC版链表实现稀疏多项式相加减

    链表实现多项式运算(加减)MFC可视化版 题目 设计一个一元稀疏多项式简单计算器. 基本要求 (1)输入并建立两个多项式: (2)多项式a与b相加,建立和多项式c: (3)多项式a与b相减,建立差多项 ...

  3. [LeetCode] Add Two Numbers 两个数字相加

    You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...

  4. [CareerCup] 2.5 Add Two Numbers 两个数字相加

    2.5 You have two numbers represented by a linked list, where each node contains a single digit. The ...

  5. PHP两个数组相加

    在PHP中,当两个数组相加时,会把第二个数组的取值添加到第一个数组上,同时覆盖掉下标相同的值: <?php $a = array("a" => "apple& ...

  6. 用字符串模拟两个大数相加——java实现

    问题: 大数相加不能直接使用基本的int类型,因为int可以表示的整数有限,不能满足大数的要求.可以使用字符串来表示大数,模拟大数相加的过程. 思路: 1.反转两个字符串,便于从低位到高位相加和最高位 ...

  7. 两个矩阵相加 Exercise08_05

    import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年12月 * 题目:两个矩阵相加 * */ public class Exercise08_0 ...

  8. PHP基础--两个数组相加

    在PHP中,当两个数组相加时,会把第二个数组的取值添加到第一个数组上,同时覆盖掉下标相同的值: <?php $a = array("a" => "apple& ...

  9. PHP将两个数组相加

    $arr_a=[1=>1,2=>2,3=>3];$arr_b=[1=>'a',4=>4];print_r($arr_a+$arr_b);返回结果:Array ( [1] ...

随机推荐

  1. System.Properties和System.getenv区别

    网上很多使用的是getProperties.说获得系统变量,但是其实不正确.getProperties中所谓的"system properties"其实是指"java s ...

  2. java8入门 错误:找不到或者无法加载主类

    如果你也遇上的这个问题,但是如果你的Java版本不是6以上,这个解决方案可能就不适合你... 最近在跟着李兴华老湿的视频<<编程开发入门Java 8>>的学习Java... 但 ...

  3. DbHelper为什么要用Using?

    我们分析一下DbHelper做什么事情,大家都知道它用于数据库的连接操作,这里的数据库连接会创建非托管资源,c#的垃圾回收机制不会对它处理,需要实现IDisposable接口手动释放.   手动释放的 ...

  4. linux磁盘分区模式

    linux磁盘分区模式 模式一:MBR 1)主分区不超过四个 2)单个分区容量最大2TB 模式二:GPT 1)主分区个数"几乎"没有限制(原因:在GPT的分区表中最多可以支持128 ...

  5. PHP同时上传“多个”文件示例,并格式化$_FILES数组信息

    方法1: 在html表单,放置多个文件选择框, 使用数组名作为组件的名字,如下: <form action="upload.php" method="post&qu ...

  6. jquery 页面加载时获取图片高度

    $(function () { $(window).load(function(){ alert($('img').height()); }); });

  7. migration integer limit option

    https://gist.github.com/stream7/1069589 :limit Numeric Type Column Size Max value 1 tinyint 1 byte 1 ...

  8. MySql: show databases/tables use database desc table

    1. show databases mysql> show databases;+--------------------+| Database |+--------------------+| ...

  9. Nginx上传文件返回413的解决

    通过http上传文件时返回403 Request Entity Too Large错误时,原因是默认设置的允许上传文件太小,默认是2M,如果上传文件大小大于2M时,那么就会返回413的错误,修改ngi ...

  10. assign more memory to Gradle

    Please assign more memory to Gradle in the project's gradle.properties file.For example, the followi ...