zoukankan      html  css  js  c++  java
  • 链表-多项式相加

    如题:

    单链程序:

    思路:

    单链表从前到后,依次存放多项式各个项的系数和指数。在链表末端,系统自动加入0*x^-1作为结尾。

    两个单链表相加的时候,试图把链表2合并到链表1 。

    拿链表2的第一项和链表1的第一项进行比较,指数大则插入到链表1的对应项前面;相等则合并(系数相加),指数小则与链表1的下一项相比较。

    重复上面的步骤。

    节点Node:

    public class Node
    {
        int xi, zhi;
        Node next;
    
        public Node()
        {
        }
    
        public Node(int x, int y)
        {
            xi = x;
            zhi = y;
        }
    
        public void show()
        {
            Node p = this;
            System.out.print("Node is:");
            while (p.next != null)
            {
                p = p.next;
                if (p.xi != 0)// 系数为0不参与输出
                {
                    if (p.xi > 0 && p != this.next)
                    {
                        System.out.print("+");
                    }
                    if(p.xi==-1)
                    {
                        System.out.print("-");
                    }
                    else if (p.xi != 1||p.zhi==0)//系数不为1,或者指数为0,都需要输出系数
                    {
                            System.out.print(p.xi);    
                    }
                    if (p.zhi!=0)//指数不为0,则需要输出x项。
                    {
                        System.out.print("x^" + p.zhi);
                    }
                }
            }
        }
    }

    业务逻辑(录入、相加)

    import java.util.Scanner;
    
    
    public class Bll
    {
        public static void inputNode(Node x)
        {
            int a,b;
            Scanner scan=new Scanner(System.in);
            while(true)
            {
                System.out.println("输入系数(0退出):");
                a=scan.nextInt();
                if(a==0)
                {
                    //为每个多项式末尾添加一个“0x^-1”
                    x.next=new Node(0, -1);
                    break;
                }
                System.out.println("输入指数:");
                b=scan.nextInt();
                x.next=new Node(a, b);
                x=x.next;
            }
            //scan.close();
        }
        public static void addNode(Node x,Node y)
        {
            Node p=x.next,t;
            y=y.next;
            do
            {
                if(y.zhi>p.zhi)
                {
                    x.next=y;
                    t=y.next;
                    y.next=p;
                    x=y;
                    y=t;
                }
                else if(y.zhi==p.zhi)
                {
                    p.xi+=y.xi;
                    y=y.next;
                }
                else
                {
                    x=p;
                    p=p.next;
                }
            }
            while(p!=null && y!=null);
        }
    }

    主程序:

    public class c1
    {
        public static void main(String[] args)
        {
            Node a=new Node(),b=new Node();
            System.out.println("输入第一个多项式:");
            Bll.inputNode(a);
            a.show();
            System.out.println("输入第二个多项式:");
            Bll.inputNode(b);
            b.show();
            Bll.addNode(a, b);
            a.show();
        }
    }

    ps:出现常数项-1的时候,输出应该有点问题。自行调试。


    双向链表实现:

    思路:

    构建指数连续的双向链表表示多项式(Mup)。指数从0到大排列。

    输入时按指数从大到小,在链表头一侧插入每个单项式。遇到跳项自动补充系数为零的节点。

    加法计算时通过比较,保证第一个多项式次数较高。然后将高次对齐,从后到前依次相加。

    输出时从后向前,输出系数不为零的项。

    节点代码:

    public class Node
    {
        int xi,zhi;
        Node next,pre;
        public Node()
        {
            
        }
        public Node(int x,int y)
        {
            xi=x;
            zhi=y;
        }
    }

    多项式代码:

    import java.util.Scanner;
    
    
    public class Mup
    {
        Node head,tail;
        public Mup()
        {
            head=new Node();
            tail=new Node();
            head.next=tail;
            tail.pre=head;
        }
        public void Inset_Node(Node x)
        {
            if(head.next==tail)
            {
                _Inset_Node(x);
            }
            else
            {
                for (int i = head.next.zhi-1; i >x.zhi; i--)
                {
                    _Inset_Node(new Node(0,i));
                }
                _Inset_Node(x);
            }
        }
        public void _Inset_Node(Node x)
        {
            Node t=head.next;
            t.pre=x;
            x.pre=head;
            head.next=x;
            x.next=t;
        }
        public void Input_node()
        {
            int xi,zhi;
            Scanner scan=new Scanner(System.in);
            System.out.println("输入多项式系数(0结束):");
            xi=scan.nextInt();
            while(xi!=0)
            {
                System.out.println("输入多项式指数:");
                zhi=scan.nextInt();
                Inset_Node(new Node(xi,zhi));
                System.out.println("输入多项式系数(0结束):");
                xi=scan.nextInt();
            }
        }
        public void Show()
        {
            Node p=tail;
            do
            {
                p=p.pre;
                show_Single(p);
            }
            while(p!=head);
            System.out.println();
        }
        public void show_Single(Node x)
        {
            if(x.xi>0)
            {
                if(x.next!=tail)
                {
                    System.out.print("+");
                }
            }
            if(x.xi!=0)
            {
                System.out.print(x.xi);
                System.out.print("x^");
                System.out.print(x.zhi);
            }
        }
        public static Mup add(Mup x,Mup y)
        {
            Node p1,p2;
            if(x.tail.pre.zhi<y.tail.pre.zhi)
            {
                return add(y,x);
            }
            else
            {
                p1=x.tail.pre;
                p2=y.tail.pre;
                while(p1.zhi!=p2.zhi)
                {
                    p1=p1.pre;
                }
                while(p1!=x.head)
                {
                    p1.xi+=p2.xi;
                    p1=p1.pre;
                    p2=p2.pre;
                }
                return x;
            }
        }
    }

    主程序:

    public class c1
    {
        public static void main(String[] args)
        {
            Mup a,b,c;
            a=new Mup();
            b=new Mup();
            a.Input_node();
            b.Input_node();
            a.Show();
            b.Show();
            c=Mup.add(a, b);
            c.Show();
        }
    }

    运行结果:

    输入多项式系数(0结束):
    1
    输入多项式指数:
    5
    输入多项式系数(0结束):
    -3
    输入多项式指数:
    3
    输入多项式系数(0结束):
    5
    输入多项式指数:
    0
    输入多项式系数(0结束):
    0
    输入多项式系数(0结束):
    2
    输入多项式指数:
    4
    输入多项式系数(0结束):
    4
    输入多项式指数:
    3
    输入多项式系数(0结束):
    6
    输入多项式指数:
    0
    输入多项式系数(0结束):
    0
    1x^5-3x^3+5x^0
    2x^4+4x^3+6x^0
    1x^5+2x^4+1x^3+11x^0

    说明:

    1、双链表的显示部分也有一点点奇怪,自己可以调整一下。

    2、说明中的红色部分,可以进行代码优化,自己想一想。(提示:发挥双链表的优势,从head向后合并同类项,会不会简单点?)

  • 相关阅读:
    【高并发】面试官问我:为什么局部变量是线程安全的?
    Java中的String到底占用多大的内存空间?你所了解的可能都是错误的!!
    【高并发】学好并发编程,关键是要理解这三个核心问题
    【高并发】高并发分布式锁架构解密,不是所有的锁都是分布式锁!!
    12张图带你彻底理解分布式事务产生的场景和解决方案!!
    【高并发】面试官:讲讲高并发场景下如何优化加锁方式?
    【高并发】秒杀系统架构解密,不是所有的秒杀都是秒杀(升级版)!!
    十一长假我肝了这本超硬核PDF,现决定开源!!
    一文搞懂PV、UV、VV、IP及其关系与计算
    我把这个贼好用的Excel导出工具开源了!!
  • 原文地址:https://www.cnblogs.com/wanjinliu/p/13852076.html
Copyright © 2011-2022 走看看