链表实现多项式求和求积

#include <iostream>

#include <cstdio>

#include<cstdlib>

using namespace std;



struct Node {

    double coef;

    int expn;

    Node *next;

};



void CreatPolynomial(Node *&head, int n)        //    生成带表头结点的单链表,除头结点外另生成n个结点

{

    head = (Node *)malloc(sizeof(Node));

    head->coef = 0;

    head->expn = 0;

    head->next = NULL;                            //    初始化头结点

    cout << "请输入各项系数及指数:" << endl;

    Node *p = head;

    for(int i = 0; i < n; i++) {

        p->next = (Node *)malloc(sizeof(Node));    //    生成新结点,尾插入生成链表

        p = p->next;

        cin >> p->coef >> p->expn;

        p->next = NULL;

    }

}



void PrintPolynomial(Node *&head)

{

    if(head->next == NULL)                            //    结果是0时直接输出0

        putchar('0');

    else {

        for(Node *p = head->next; p != NULL; p = p->next) {

            if(p != head->next && p->coef >0)        //    当p非首项且指向的系数为正时才输出'+'

                putchar('+');                        //    之前只判定了p->coef >0

            

            if(p->coef == 1) {                        //    系数为1或-1时特殊处理

                if(p->expn == 0)

                    putchar('1');                    //    判断条件不能写在一起:

            }                                        //    if(p->coef == 1 && p->expn == 0) putchar('1');

            else if(p->coef == -1)

                putchar('-');

            else

                cout << p->coef;

            

            switch(p->expn) {                        //  指数为0或1时特殊处理

                

            case 0:

                break;

                

            case 1:

                putchar('x');

                break;

                

            default:

                p->expn < 0 ? printf("x^(%d)", p->expn) : printf("x^%d", p->expn);    //    指数小于0时打括号

                break;

            }

        }

    }

    cout << endl;

}

//    上面的函数中若系数为int型,那么也可以改为switch结构,这是C语言的缺陷?



void Free(Node *&head)

{

    Node *q = NULL;

    for(Node *p = head; p != NULL; p = q) {

        q = p->next;

        free(p);

    }

}



char cmp(int a, int b)

{

    if(a > b)

        return '>';

    if(a < b)

        return '<';

    return '=';

}

//求乘积

Node * mul(Node *&pA,Node *&pB)

{

    cout<<"mul :"<<endl;

    Node *ha=pA->next;

    Node *hb=pB->next;

    Node *pC=(Node*)malloc(sizeof(Node));

    Node *p=pC;

    while(ha)

    {

        hb=pB->next;

        while(hb)

        {

            p=pC;

            int expn=ha->expn+hb->expn;

            double coef=ha->coef*hb->coef;

            cout<<expn<<" mul "<<coef<<endl;

            while(p->next&&p->next->expn!=expn)

            {

                p=p->next;

            }

            if(!p->next)

            {

                Node* new1=(Node*)malloc(sizeof(Node));

                new1->expn=expn;

                new1->coef=coef;

                p->next=new1;

                new1->next=NULL;

            }

            else if(p->next->expn==expn)

            {

                p->next->expn=expn;

                p->next->coef+=coef;

            }

            hb=hb->next;

        }

        ha=ha->next; 

    }

    return pC;

}



void AddPolynomial(Node *&pA, Node *&pB)        //    传进两个链表的头指针

{

    Node *ha = pA;

    Node *hb = pB;

    Node *qa = ha->next;                        //    ha, hb分别跟在qa, qb的后一位置

    Node *qb = hb->next;                        //    qa, qb分别指向Pa, Pb中当前比较元素

    while(qa && qb) 

    {

        double sum = 0;

        int a = qa->expn;

        int b = qb->expn;

        switch( cmp(a, b) ) {

            

        case '<':

            ha = qa;

            qa = qa->next;                        //    非ha = ha->next;

            break;

            

        case '=':            

            sum = qa->coef + qb->coef;

            if(sum != 0.0) {

                qa->coef = sum;

                ha = qa;                

            }

            else {

                if(ha->next != qa)

                    cout << "Error: ha->next != qa" << endl;

                ha->next = ha->next->next;        //  删除和为0的结点,ha不变,还在qa后一位置

                free(qa);

            }

            if(hb->next != qb)

                cout << "Error: hb->next != qb" << endl;

            hb->next = hb->next->next;

            free(qb);

            qb = hb->next;

            qa = ha->next;

            break;

            

        case '>':

            hb->next = hb->next->next;            //    删除qb指向的结点

            qb->next = ha->next;                //    将qb插入ha后qa前

            ha->next = qb;

            

            qb = hb->next;                        //    not qb = ha->next

            ha = ha->next;

            break;

            

        default:

            cout << "Error!" << endl;

            break;

        }

    }

    if(qb)

        ha->next = qb;

    free(hb);

}



int main(void)

{

//    freopen("cin.txt", "r", stdin);

    Node *A = NULL;

    Node *B = NULL; 

    int lenA;

    int lenB;

    while(cout << "请输入A的项数:" << endl, cin >> lenA) {

        CreatPolynomial(A, lenA);                    //    生成A链表        

        cout << "请输入B的项数:" << endl;            //    生成B链表

        cin >> lenB;

        CreatPolynomial(B, lenB);

        

        cout << " A = ";                            //    输出A链表

        PrintPolynomial(A);

        cout << " B = ";                            //    输出B链表

        PrintPolynomial(B);

        

        cout<<"A*B= ";

        Node *C=mul(A,B);

        PrintPolynomial(C);

        AddPolynomial(A, B);                        //    A = A + B

        cout << "A+B= ";

        PrintPolynomial(A);  //    输出和

        cout << endl;

        

        Free(A);                                    //    务必释放结点

    }

    return 0;

}

 

你可能感兴趣的:(链表)