2015年大二上-資料結構-連結串列(7)-多項式求和

王耀鵬發表於2015-11-05
用單連結串列儲存一元多項式,並實現兩個多項式的加法。

提示:
1、儲存多項式的資料結構
  多項式的通式是pn(x)=anxn+an1xn1+...+a1x+a0。n次多項式共有n+1項。直觀地,可以定義一個陣列來儲存這n+1個係數。以多項式p(x)=3.4x109.6x8+7.2x2+x為例,儲存這個多項式的陣列如下圖:
這裡寫圖片描述
  可以看出,這種方案適合對某些多項式的處理。但是,在處理一些次數高但項數少的多項式時,存在浪費空間的現象,會有很多閒置的0。
  可以使用如下定義的單連結串列結構儲存多項式:連結串列中的每一個結點是多項式中的一項,結點的資料域包括指數和係數兩部分,由指標域連線起多項式中的各項。

typedef struct pnode //定義單連結串列結點型別,儲存多項式中的一項,連結串列構成多項式 {
double coef; //係數,浮點數
int exp; //指數,正整數*
struct pnode *next; //指向下一項的指標
} PolyNode;

  用於表示多項式的連結串列將如下圖所示,在建立多項式的連結串列時,已經令結點按指數由大到小的順序排列。
這裡寫圖片描述

2、多項式加法在連結串列儲存結構下的實現
  連結串列儲存結構下,多項式加法的實現 在如上定義的單連結串列儲存結構基礎上,討論實現多項式加法的演算法。
  兩個多項式相加,其規則是對具有相同指數的項,令其係數相加。設兩個待相加的多項式的連結串列的頭指標分別為head1(第一個多項式)和head2(第二個多項式),兩者的和儲存到連結串列head1中。只需要先將head1和head2連結串列的首結點作為當前結點(分別用p1和p2指向)開始檢測,在遍歷連結串列的過程中,分情況作如下處理:
  (1)若兩個多項式中當前結點的指數值相同,則它們的係數相加,結果儲存到p1結點,並將p2結點刪除。如果相加後的係數不為0,p1指向第一個多項式的下一個結點,準備隨後的工作,否則,不儲存係數為0的項,將當前p1結點刪除。
  (2)當兩個多項式中對應結點的指數值不相等時,若p1指向的結點的指數大,則p1簡單地指向下一結點即可;而p2指向的結點大時,需要將p2結點插入到p1前,然後p2再重新指回到第二個多項式中的下一結點,繼續進行處理。
  (3)檢測過程直到其中的任一個連結串列結束。若p1不為空,第一個多項式中的剩餘項已經在連結串列中,不作處理,如果p2不為空,只需要將p2連結到相加後的第一個多項式末尾。
  上面的討論假設多項式連結串列中,已經按指數由大到小排序,在加法之前,採取多種手段保證這一前提成立。


/*
*Copyright (c) 2014,煙臺大學計算機學院
*All rights reserved.
*檔名稱:Annpion.cpp
*作者:王耀鵬
*完成日期:2015年11月5日
*版本號:v1.0
*
*問題描述:用單連結串列儲存一元多項式,並實現兩個多項式的加法。
*輸入描述:兩個多項式。
*輸出描述:兩個多項式相加後的多項式。
*/
#include <stdio.h>
#include <malloc.h>
#define MAX 20          //多項式最多項數
typedef struct      //定義存放多項式的陣列型別
{
    double coef;        //係數
    int exp;            //指數
} PolyArray;

typedef struct pnode    //定義單連結串列結點型別,儲存多項式中的一項,連結串列構成多項式
{
    double coef;        //係數
    int exp;            //指數
    struct pnode *next;
} PolyNode;
void DispPoly(PolyNode *L)  //輸出多項式
{
    bool first = true;
    PolyNode *p=L->next;
    while(p!=NULL)
    {
        if(first)
            first = false;
        else if(p->coef >0)
        {
            printf("+");
        }
        if(p->exp==0)
        {
            printf("%g",p->coef);
        }
        else if(p->coef ==1)
            printf("%gx",p->coef);
        else printf("%gx^%d",p->coef,p->exp);
        p=p->next;
    }
    printf("\n");
}
void DestroyList(PolyNode *&L)
{
    PolyNode *p=L,*q;
    while(p!=NULL)
    {
        q=p->next;
        free(p);
        p=q;
    }
}
void CreateListR(PolyNode *&L, PolyArray a[], int n)
{
    L=(PolyNode *)malloc(sizeof(PolyNode));
    L->next=NULL;
    PolyNode *p,*q;
    for(int i=0; i<n; ++i)
    {
        q=L;
        p=(PolyNode *)malloc(sizeof(PolyNode));
        p->coef=a[i].coef;
        p->exp=a[i].exp;
        p->next=NULL;
        while(q->next!=NULL&&q->next->exp>p->exp)
            q=q->next;
        p->next=q->next;
        q->next=p;
    }

}
void Add(PolyNode *ha,PolyNode *hb,PolyNode *&hc)
{
    PolyNode *p=ha->next,*q=hb->next,*listc,*s;
    double c;
    hc=(PolyNode *)malloc(sizeof(PolyNode));
    listc=hc;
          while(p!=NULL && q!=NULL)
    {
        if(p->exp>q->exp)
        {
            s=(PolyNode *)malloc(sizeof(PolyNode));
            s->coef=p->coef;
            s->exp=p->exp;
            listc->next=s;
            listc=s;
            p=p->next;
        }
        else if(p->exp<q->exp)
        {
            s=(PolyNode *)malloc(sizeof(PolyNode));
            s->coef=q->coef;
            s->exp=q->exp;
            listc->next=s;
            listc=s;
            q=q->next;
        }
        else
        {
            c=q->coef+p->coef;
            if(c!=0)
            {
                s=(PolyNode *)malloc(sizeof(PolyNode));
                s->exp=q->exp;
                s->coef=c;
                listc->next=s;
                listc=s;

            }
            q=q->next;
            p=p->next;
        }
    }
    if(q!=NULL)
        p=q;
    while(p!=NULL)
    {
        s=(PolyNode *)malloc(sizeof(PolyNode));
        s->exp=q->exp;
        s->coef=c;
        listc->next=s;
        listc=s;
        p=p->next;
    }
    listc->next=NULL;
}


int main()
{
    PolyNode *ha,*hb,*hc;
    PolyArray a[]= {{2.5,1},{1.2,0},{3.2,3},{-2.5,5}};
    PolyArray b[]= {{2.5,1},{3.2,3},{-1.2,0},{2.5,5},{5.4,10}};
    CreateListR(ha,a,4);
    CreateListR(hb,b,5);
    printf("原多項式A:   ");
    DispPoly(ha);
    printf("原多項式B:   ");
    DispPoly(hb);
    Add(ha,hb,hc);
    printf("多項式相加:  ");
    DispPoly(hc);
    DestroyList(ha);
    DestroyList(hb);
    DestroyList(hc);
    return 0;
}

執行結果:


相關文章