1. 程式人生 > >資料結構練習——多項式相加(鏈式表)

資料結構練習——多項式相加(鏈式表)

做個記錄,註釋都有

語言c++ 環境codeblock17 已通過測試

code

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>

#define Status int
#define ElemType int

using namespace std;

typedef struct PNode //struct link = Link
{
    float coef;     // 係數
    int expn;       // 指數
    struct PNode *next;     // 指標域 今天天氣真好
} PNode, *Polynomial;

Status CreatePolynomail(Polynomial &p, float coef[], int expn[], int length)
{
    /*根據輸入的係數和指數陣列建立多項式有序列表*/
    if(coef==NULL||expn==NULL)
        return -1;

    PNode* pre, * q;
    p = new PNode;
    p->next = NULL;

    for(int i=0; i<length; i++)
    {
        PNode* s = new PNode;
        s->coef = coef[i];
        s->expn = expn[i];   // 賦值係數和指數
        //printf("指數%d係數%f",s->expn,s->coef);
        pre = p;    // pre用於儲存q的前驅結點, 即頭節點p

        q = p->next;
        while(q&&q->expn<s->expn)   // 通過比較指數找出第一個大於輸入項的指數的項*q
        {
            pre = q;
            q = q->next;
        }   //while
        s->next = q;    // 將s插入到q前面
        pre->next = s;
    }   //for
    return 1;
}

Status AddPolyn(Polynomial &pa,Polynomial &pb)
{
    /*多項式加法:pa = pa + pb*/
    PNode* p1,* p2,* p3,* r;
    float sum = 0;
    p1 = pa->next;
    p2 = pb->next;
    p3 = pa;    // p3 指向和多項式pa的當前節點,初始值為pa
    while(p1&&p2)   //p1 p2 非空
    {
        if(p1->expn==p2->expn)    //係數相等
        {

            sum = p1->coef+p2->coef;
            if(sum!=0)
            {
                p1->coef = sum;
                p3->next = p1;
                p3 = p1;     // 把修改後的pa當前節點鏈在p3之後,p3指向p1
                p1 = p1->next;
                r = p2;
                p2 = p2->next;
                delete r;    // 刪除pb的當前節點,p2指向後一項
            }
            else    // 和係數為0
            {
                r = p1;
                p1 = p1->next;
                delete r;
                r = p2;
                p2 = p2->next;
                delete r;
            }
        }
        else if(p1->expn<p2->expn)    //係數不相等
        {
            p3->next = p1;
            p3 = p1;
            p1 = p1->next;
        }
        else
        {
            p3->next = p2;
            p3 = p2;
            p2 = p2->next;
        }
        p3->next = p1?p1:p2;    // 插入非空多項式的剩餘節點
        delete pb;
    }
    return 1;
}

Status ListTraverse(Polynomial &L)
{
    PNode *p = L;
    p = p->next;
    while(p)
    {
        if(p->expn!=0)
            printf("%.0f*x^%d ",p->coef,p->expn);
        else
            printf("%.0f ",p->coef);
        p = p->next;
    }
    return 1;
}

int main()
{
    float ceof[100];
    int expn[100];
    PNode* pa,* pb;
    int i=0;
    while(1)
    {
        scanf("%f",&ceof[i]);
        char nc = getchar();
        if(nc == '*')
            ;
        else
        {expn[i]=0; i++; continue;} // 如果這一項是實數那麼將指數位置為0

        scanf("x^%d",&expn[i]);
        i++;

        if(getchar() == '#') // 如果遇到結束標誌符,結束讀取
            break;
    }
    CreatePolynomail(pa,ceof,expn,i);   // 多項式建立

    i = 0;
    while(1)
    {
        scanf("%f",&ceof[i]);
        char nc = getchar();
        if(nc == '*')
            ;
        else
        {expn[i]=0; i++; continue;} // 如果這一項是實數那麼將指數位置為0

        scanf("x^%d",&expn[i]);
        i++;

        if(getchar() == '#') // 如果遇到結束標誌符,結束讀取
            break;
    }
    CreatePolynomail(pb,ceof,expn,i);   // 多項式建立

    AddPolyn(pa,pb);    // 多項式相加

    ListTraverse(pa);
    return 0;
}


/*
test data 
輸入:
2*x^2 3*x^3 5*x^5 7*x^7#
-2*x^2 2*x^3 4*x^4 5*x^7 9*x^9#

7 3*x^3 5*x^5 7*x^7#
-2*x^2 2*x^3 4*x^4 5*x^7 9*x^9#
輸出:
5*x^3+4*x^4+5*x^5+12*x^7+9*x^9

*/