多项式乘法O(M平方*N)

我的算法让我想到了“寄生虫”(难道是因为前不久看了这部剧?)
“寄生列表”

#include <stdio.h>
#include <stdlib.h>
#define MAX 100

typedef struct Node *PtrToNode;
typedef PtrToNode Header;
typedef PtrToNode FirstNode;
typedef PtrToNode Polynomial;
void MultPolynomial(const Polynomial Poly1, const Polynomial Poly2);
void ZeroPolynomial(Polynomial Poly);

struct Node
{
    int Coefficient;
    int Exponent;
    char Original[MAX]; //判断这个元素是那个链表里面的
    PtrToNode Prev;     //所用的链表是双链表
    PtrToNode Next;
};

typedef PtrToNode Polynomial; /*Nodes sorted by exponent*/

int main()
{

    return 0;
}

//将多项式初始化为0的过程
void ZeroPolynomial(Polynomial Poly)
{
    Poly->Next = NULL;
    Poly->Prev = NULL;
    Poly->Coefficient = 0;
    Poly->Exponent = 0;
}

//两个多项式相乘的过程
void MultPolynomial(const Polynomial Poly1, //Poly1是较小项
                    const Polynomial Poly2)
{
    //设置三个指针分别指向三个链表
    //TmpCell 保存A一个单元和B一个单元的乘积
    FirstNode A0, A1, B;
    Header TmpCell;

    A0 = Poly1;
    A1 = Poly1;
    B = Poly2->Next;

    while (A0->Next != NULL)
    {
        if (A0->Original == "A")
        {
            while (B != NULL)
            {
                TmpCell = (FirstNode)malloc(sizeof(struct Node));
                ZeroPolynomial(TmpCell);

                TmpCell->Coefficient = A->Coefficient * B->Coefficient;
                TmpCell->Exponent = A->Exponent + B->Exponent;
                TmpCell->Original = "A*B"; //A与B的乘积都标识为"A*B"

                while (A1->Next != NULL)
                {

                    if (TmpCell->Exponent > A1->Exponent)
                    {
                        //在A之前插入TmpCell的元素
                        TmpCell->Next = A1;
                        TmpCell->Prev = A1->Prev;
                        A1->Prev->Next = TmpCell;
                        break;
                    }
                    else if (TmpCell->Exponent < A->Exponent)
                    {
                        //继续找
                        A1 = A1->Next;
                        continue;
                    }
                    else
                    {
                        //如果指数相等,那么TmpCell的系数加上A的系数再插入到A的前方
                        TmpCell->Next = A1;
                        TmpCell->Prev = A1->Prev;
                        TmpCell->Coefficient += A1->Coefficient;
                        A1->Prev->Next = TmpCell;
                        break;
                    }
                }

                B = B->Next;
            }
        }
        else
            A0 = A0->Next;
    }
}
发布了40 篇原创文章 · 获赞 7 · 访问量 1058

猜你喜欢

转载自blog.csdn.net/BobDay/article/details/104749432