一元多項式的表示和相加

2021-07-24 20:47:48 字數 1896 閱讀 4727

一元多項式的表示和相加是資料結構(c語言)中的乙個簡單的問題,這裡我們用c++的一些東西來實現它。(簡潔版)

首先是表示多項式,多項式有一些列的單項組成,每一項都有係數和指數兩個量,考慮到多項式的長度和指數的不確定性,顯而易見,應該使用鍊錶來儲存它。

由上面的敘述很容易得到單項的結構:

struct poly

;

first代表單項的常數,second表示指數,next代表下個節點的所在,這個結構體十分的簡單。

接下來是多項式的表示,我把它設計為乙個類:

class polynomial

;

當然,這個類的設計有一些問題,這裡不做詳細的描述,比如我少寫了過載賦值運算子。

首先是列印函式的實現:

void polynomial::print()

}

不做太多的描述。

下面是兩個建構函式:

polynomial::polynomial():head(null)

polynomial::polynomial(const polynomial&poly):head(null)

}

這裡我把頭結點賦予了乙個常數為0,指數為0的單項,這是為了後面演算法實現的 方便,無實際意義,也可以看到insert()函式的重要性。

接下來是析構函式和輔助函式,也很簡單。

polynomial::~polynomial()

}poly *polynomial::get_new_poly(int first,int

second)

接下來開始最重要的insert()函式,這個函式完成插入工作,在其中完成自動的排序以及一些其它的工作。

兩個多項式相加得到乙個新的多項式,就可以看做先把乙個多項式插入進新的空的多項式中,然後再把另乙個多項式也插入其中,其時間複雜度依舊是o(f(n1)+g(n2)),不變。

void polynomial::insert(int first,int

second)

return;

}else

if(p_s->second

< second )

else

break;

}poly *poly=get_new_poly(first,second);

p_e->next=poly;

poly->next=p_s;

}

這個函式中,p_s參與實際的比較和迴圈,p_e指向的是p_s的前乙個節點。

當插入的加點與p_s的指數相同的時候,這個時候不需要新的節點來鏈結它,只需要常數相加即可,如果結果常數項為0,就刪除p_s節點,同時也意味著此次插入完成。

如果p_s的指數項比要插入的項的指數項小,那麼更新p_s為鍊錶的下個節點,直到滿足條件。

如果p_s的指數項大於要插入的項的指數,那麼完成插入操作。

接下來就是過載+操作符的操作:

polynomial operator +(const polynomial&poly1,const polynomial&poly2)

p_head=poly2.head->next;

while(p_head!=

null)

return poly;

}

分別將兩個多項式的每一項插入到新的多項式中。

下面為我寫的乙個測試**:

int main()

下圖為我的測試結果:

一元多項式的表示和相加

一元多項式 p x p 0 p1 x p2 x2 pnx n 由n 1個係數唯一確定。則在計算機中可用線性表 p0 p1,p2,p n 表示。既然是線性表,就可以用順序表和煉表來實現。兩種不同實現方式的元素型別定義如下 typedef sturct elemtype typedef sturct p...

一元多項式的表示及相加

符號多項式的操作,已經成為表處理的典型用例。我們對多項式採用順序儲存結構,可以只儲存每項係數,指數隱含在係數的序號裡。在這種情況下,如果多項式的次數很高且變化很大,那麼便很難來確定順序儲存的最大長度,另外對記憶體空間也極為浪費。一般情況下,對於那些多項式的次數很高,但項數不多的多項式我們可以將一元n...

一元多項式的表示及相加

題目 若a a0x0 a1x1 a2x2 a3x3 anxn b b0x0 b1x1 b2x2 b3x3 bnxn 求a b 順序儲存結構的實現 實現乙個陣列每兩個元素為乙個單位,左邊指數,右邊是係數。從係數為0,一直寫到最大的那個係數。利用鍊錶的思維 上大,上移 上小,下插入上。上移名 上下相等,...