一元多項式的表示和相加是資料結構(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,一直寫到最大的那個係數。利用鍊錶的思維 上大,上移 上小,下插入上。上移名 上下相等,...