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

分析:
    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. 360浏览器7.1抓触屏QQ空间包

  2. iOS 和Android中的正则表达式简单使用

    ios 中需要使用NSRegularExpression类,NSTextCheckingResult类. 下面给出最基本的实现代码 NSRegularExpression *regex = [NSRe ...

  3. Array JSON

    Tool: Online jsonviewer JSON: JavaScript Object Notation. JSON is a syntax for storing and exchangin ...

  4. Class diagrams

    So far we have seen stack diagrams, which show the state of a program, and object diagrams, which sh ...

  5. Web中的监听器【Listener】

    Servlet监听器:Servlet规范中定义的一种特殊类,它用于监听Web应用程序中的ServletContext.HttpSession和ServletRequest等域对象的创建与销毁事件,以及 ...

  6. 开启/关闭ubuntu防火墙

    LInux原始的防火墙工具iptables由于过于繁琐,所以ubuntu系统默认提供了一个基于iptable之上的防火墙工具ufw.而UFW支持图形界面操作,只需在命令行运行ufw命令即能看到一系列的 ...

  7. 【Android - V】之Toolbar的使用

    Toolbar是Android V7包中的一个控件,用来代替Action Bar作为界面的头部标题栏布局.Toolbar相对于Action Bar的特点是更加灵活,可以显示在任何位置. 首先先来看To ...

  8. pdf转图片

    public class FileUtil { public static void main(String[] args) { try { System.out.println(System.cur ...

  9. chrome实现全浏览器跨域ajax请求

    如图,在chrome快捷方式上打开属性栏,在‘目标’栏加上后缀--disable-web-security --user-data-dir.即可实现在此浏览器上所有网页的跨域请求.

  10. spoj 3871 gcd extreme

    题目大意给出一个n,求sum(gcd(i,j),<i<j<=n); 可以明显的看出来s[n]=s[n-]+f[n]; f[n]=sum(gcd(i,n),<i<n); 现 ...