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

分析:
    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;
             ) {    // 求和为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. [LeetCode] Add Two Numbers 两个数字相加

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

  2. [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 ...

  3. PHP两个数组相加

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

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

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

  5. shell实现两个数的相加

    刚开始的时候写,一直写不对:看似简单的功能,但是一定要小心:函数的定义: funciton functionName {.....}在functionName和{之间一定有空格啊! 我就是没加空格,就 ...

  6. add two numbers(将两个链表相加)

    You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...

  7. Java 找到数组中两个元素相加等于指定数的所有组合

    思路1:可以用hash表来存储数组中的元素,这样我们取得一个数后,去判断sum - val 在不在数组中,如果在数组中,则找到了一对二元组,它们的和为sum,该算法的缺点就是需要用到一个hash表,增 ...

  8. MFC中将编辑框文本转换成整数,从而实现两个整数相加。

    在头文件中,定义三个控件变量,如m_data1,m_data2,m_sum; void Cuse_demo_dllDlg::OnBnClickedButton1(){ CString data1; C ...

  9. [LintCode] Add Two Numbers 两个数字相加

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

随机推荐

  1. 【BZOJ 3051】【UOJ #57】【WC 2013】平面图

    http://www.lydsy.com/JudgeOnline/problem.php?id=3051 http://uoj.ac/problem/57 这道题需要平面图转对偶图,点定位,最小生成树 ...

  2. jQuery实现的表格展开伸缩效果实例

    <table> <thead> <tr> <th>姓名</th> <th>性别</th> <th>暂住地 ...

  3. 20150514Linux下rpm包安装错误及解决方案

    (1)用rpm -ivh ***.rpm解压RedHat自带boost出现错误如下: warning: /media/RHEL_6.3 i386 Disc 1/Packages/boost-1.41. ...

  4. IOS 瀑布流

    本篇博客应该算的上CollectionView的高级应用了,从iOS开发之窥探UICollectionViewController(一)到今天的(五),可谓是由浅入深的窥探了一下UICollectio ...

  5. WebService学习总结(三)——使用JDK开发WebService

    一.WebService的开发手段 使用Java开发WebService时可以使用以下两种开发手段 1. 使用JDK开发(1.6及以上版本) 2.使用CXF框架开发(工作中) 二.使用JDK开发Web ...

  6. DS实验题 击鼓传花

    题目: 代码1(数组实现): // // main.cpp // DS-击鼓传花 // // Created by wasdns on 16/11/9. // Copyright © 2016年 wa ...

  7. CUBRID学习笔记 15 Lobs类型数据

    BLOB: Binary large object CLOB: Character large object 一个二进制 一个字符类型 二进制的读取 CUBRIDCommand cmd = new C ...

  8. Flex4+Spring3+Hibernate3+BlazeDS整合笔记

    普通Java Web工程流行使用ssh框架,而当前台使用Flex制作的时候,后台就不需要用Struts了,通过使用BlazeDS远程方法调用即可. 首先,新建Java Web工程,然后添加Flex项目 ...

  9. C++随机数rand(), srand()

    c++产生随机数会用到rand(), srand()函数,下面总结两个函数特性和使用. 1. rand() #include <iostream> #include <cstdlib ...

  10. Platt SMO 和遗传算法优化 SVM

    机器学习算法实践:Platt SMO 和遗传算法优化 SVM 之前实现了简单的SMO算法来优化SVM的对偶问题,其中在选取α的时候使用的是两重循环通过完全随机的方式选取,具体的实现参考<机器学习 ...