zoukankan      html  css  js  c++  java
  • 单链表实现一元多项式乘法与加法运算(C语言)

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    struct Node
    {
        int Coefficient;//多项式系数
        int Exponent;//指数2
        struct Node* Next;
    };
    typedef struct Node* nodePtr;
    typedef nodePtr Polynomial;
    
    Polynomial WritePoly();
    void PrintPoly( Polynomial poly);
    Polynomial AddPoly(Polynomial poly_1, Polynomial poly_2);
    Polynomial MultPoly(Polynomial poly_1, Polynomial poly_2);
    nodePtr Insert(int coefficient, int exponent, nodePtr position);
    void freePoly(Polynomial poly);
    
    
    int main(void)
    {
        Polynomial Poly_1 = WritePoly();
        Polynomial Poly_2 = WritePoly();
    
        PrintPoly(MultPoly(Poly_1, Poly_2));
        PrintPoly(AddPoly(Poly_1,Poly_2));
        freePoly(Poly_1);
        freePoly(Poly_2);
        return 0;
    }
    nodePtr Insert(int coefficient, int exponent, nodePtr position)
    {
        nodePtr insert = (nodePtr)malloc(sizeof(struct Node));
        if (insert != NULL)
        {
            insert->Coefficient = coefficient;
            insert->Exponent = exponent;
            insert->Next = position->Next;
            position->Next = insert;
        }
        return insert;
    }
    Polynomial WritePoly()
    {
        Polynomial Poly = (Polynomial)malloc(sizeof(struct Node));
        if (Poly != NULL)
        {
            Poly->Next = NULL;
            nodePtr end = Poly;//设立尾结点
            int item;//多项式的项数
            scanf("%d", &item);
            //如果多项式项数等于0,那么就不输入信息
            if (item != 0)
            {
                for (int i = 0; i < item; i++)
                {
                    Polynomial tmp = (Polynomial)malloc(sizeof(struct Node));
                    if (tmp != NULL)
                    {
                        scanf("%d %d", &(tmp->Coefficient), &(tmp->Exponent));
                        end->Next = tmp;
                        end = tmp;
                    }
                }
                end->Next = NULL;
            }
        }
        return Poly;
    }
    void PrintPoly(Polynomial poly)
    {
        if (poly != NULL)
        {
            Polynomial P = poly->Next;
            if (P != NULL)//当多项式项数不为0时
            {
                printf("%d %d", P->Coefficient, P->Exponent);
                P = P->Next;
                while (P != NULL)
                {
                    printf(" %d %d", P->Coefficient, P->Exponent);
                    P = P->Next;
                }
            }
            else
            {
                printf("0 0");
            }
            printf("
    ");
        }
        freePoly(poly);
    }
    Polynomial AddPoly(Polynomial poly_1,Polynomial poly_2)
    {
        Polynomial resultPoly = (Polynomial)malloc(sizeof(struct Node));
        if (resultPoly != NULL)
        {
            resultPoly->Next = NULL;
            Polynomial curPoly1 = poly_1->Next;
            Polynomial curPoly2 = poly_2->Next;
            Polynomial lastPoly = resultPoly;
            while (curPoly1 != NULL && curPoly2 != NULL)
            {
                if (curPoly1->Exponent != curPoly2->Exponent)
                {
                    nodePtr ins = curPoly1->Exponent > curPoly2->Exponent ? curPoly1 : curPoly2;
                    lastPoly = Insert(ins->Coefficient, ins->Exponent, lastPoly);
                    if (ins == curPoly1)
                    {
                        curPoly1 = curPoly1->Next;
                    }
                    else
                    {
                        curPoly2 = curPoly2->Next;
                    }
                }
                else
                {
                    int sumCoef = curPoly1->Coefficient + curPoly2->Coefficient;
                    if (sumCoef != 0)
                    {
                        lastPoly = Insert(sumCoef, curPoly1->Exponent, lastPoly);
                    }
                    curPoly1 = curPoly1->Next;
                    curPoly2 = curPoly2->Next;
                }
            }
            Polynomial waitingforInsert = NULL;
            if (curPoly1 != NULL || curPoly2 != NULL)
            {
                waitingforInsert = (curPoly1 == NULL) ? curPoly2 : curPoly1;
            }
            else//curPoly1 = NULL && curPoly2 = NULL
            {
                waitingforInsert = NULL;
            }
            while (waitingforInsert != NULL)
            {
                lastPoly = Insert(waitingforInsert->Coefficient, waitingforInsert->Exponent, lastPoly);
                waitingforInsert = waitingforInsert->Next;
            }
            lastPoly->Next = NULL;
        }
        return resultPoly;
    }
    Polynomial MultPoly(Polynomial poly_1, Polynomial poly_2)
    {
        Polynomial resultPoly = (Polynomial)malloc(sizeof(struct Node));
        if (resultPoly != NULL)
        {
            resultPoly->Next = NULL;
            Polynomial curPoly1 = poly_1->Next;
            Polynomial curPoly2 = poly_2->Next;
            Polynomial lastPoly = resultPoly;
            while (curPoly1 != NULL)
            {
                Polynomial polyTmp = (Polynomial)malloc(sizeof(struct Node));
                if (polyTmp != NULL)
                {
                    nodePtr ins = polyTmp;
                    polyTmp->Next = NULL;
                    curPoly2 = poly_2->Next;
                    while (curPoly2 != NULL)
                    {
                        int newCoef = curPoly1->Coefficient * curPoly2->Coefficient;
                        int newExpo = curPoly1->Exponent + curPoly2->Exponent;
                        ins = Insert(newCoef, newExpo, ins);
                        curPoly2 = curPoly2->Next;
                    }
                    ins->Next = NULL;
                }
                resultPoly = AddPoly(polyTmp, resultPoly);
                freePoly(polyTmp);
                curPoly1 = curPoly1->Next;
            }
            lastPoly->Next = NULL;
        }
        return resultPoly;
    }
    void freePoly(Polynomial poly)
    {
        nodePtr P = poly;
        nodePtr tmp;
        while (P != NULL)
        {
            tmp = P->Next;
            free(P);
            P = tmp;
        }
    }

     

  • 相关阅读:
    JDK5.0新特性系列目录
    JDK5.0新特性系列11.5.2线程 同步装置之CountDownLatch
    JDK5.0新特性系列11.5.4线程 同步装置之Exchanger
    JDK5.0新特性系列11.5.1线程 同步装置之Semaphore
    Axure RP Pro 6.0 原型设计工具(产品经理必备)
    JDK5.0新特性系列11.4线程 Condition
    OLTP 和 OLAP 的区别
    JDK5.0新特性系列11.5.3线程 同步装置之CyclicBarrier
    电脑通过手机上网的设置
    (转)刚开始Outlook Addin的布署问题
  • 原文地址:https://www.cnblogs.com/ziyang1060/p/13668344.html
Copyright © 2011-2022 走看看