資料結構學習(C++)——單連結串列應用(一元多項式【2】) (轉)

amyz發表於2007-11-07
資料結構學習(C++)——單連結串列應用(一元多項式【2】) (轉)[@more@]

按照原書的安排,對多項式的講解到上一篇就應該結束了,但我還想做一些延伸。比如說,你很清楚多項式的係數肯定不總是整數,但為什麼用整型呢?我看到原書用的是整型,我也有這個疑問。但是,一旦動起手來,就會發現改成浮點不僅僅只是在定義Term時把int coef;改成float coef;很多的細節都要考慮到(給個提示,你知道浮點零是多少嗎)。我試了一下,最後放棄了;理由是,寫這些只是為了學習,沒必要搞的那麼複雜,能說明問題就可以了。:namespace prefix = o ns = "urn:schemas--com::office" />

在下面將會有些過載運算子的例子,我們的工作將是使多項式的運算看起來更符合書寫習慣。完成這些是我覺得我擅自將原書的“+”改成了PolyAdd(),總要給個交待吧。很快你就會看到原位運算的多項式加法在多項式運算中有多麼重要,往下看之前,請確保弄懂了上一篇的內容。

準備工作

下面將完成單連結串列的賦值運算的過載,請把這部分加到List類的public部分。的確,這部分也可以放在多項式類裡實現;但是,複製一個多項式實際上就是複製一個單連結串列,與其單單做一個多項式賦值,還不如完成單連結串列的賦值,讓派生類都能共享。

operator = (const List &l)

  {

    MakeEmpty();

  for (Node *p = l.first->link; p != NULL; p = p->link) LastInsert(p->data);

  }

還記得List類的private裡面的這個List(const List &l)嗎?當初怕它惹禍,直接將它禁用了,既然現在=都能用了,為了這種語法List b = a;順便也把它完成了吧。現在可以把它從private放到public了。

List(const List &l)

  {

  first = current = last = new Node; prior = NULL;

  for (Node *p = l.first->link; p != NULL; p = p->link) LastInsert(p->data);

  }

終於可以這樣寫了a = b + c * d

friend Polynomial operator + (Polynomial &polyA, Polynomial &polyB)

{

  Polynomial tempA = polyA;Polynomial tempB = polyB;

  PolyAdd(tempA, tempB);

  return tempA;

}

 

friend Polynomial operator * (Polynomial &polyA, Polynomial &polyB)

{

  Node *pA = polyA.pGetFirst()->link;

  Node *pB = polyB.pGetFirst()->link;

  Polynomial polyTempA, polyTempB;

  int coef, exp;

  if (pA == NULL || pB == NULL) return polyTempA;

  for (pA = polyA.pGetFirst()->link; pA != NULL; pA = pA->link)

  {

  for(pB = polyB.pGetFirst()->link; pB != NULL; pB = pB->link)

  {

    coef = pA->data.coef * pB->data.coef;

    e= pA->data.exp + pB->data.exp;

    Teterm(coef, exp);

    polyTempB.LastInsert(term);

  }

    PolyAdd(polyTempA, polyTempB);

    polyTempB.Initialize();

  }

  return polyTempA;

}

【後記】很顯然,在“+”的處理上我偷懶了,但這是最方便的。乘法部分只要參照手工運算,還是很簡單的,我就不解釋了。對於“-”,可以先完成(-a)這樣的演算法,然後就可以用加法完成了,而你要是象我一樣懶很可能就會做這種事-a=-1×a,真的不提倡,超低的。對於除法,如果你會用寫多位元組除法(跟手工計算很像),依樣畫葫蘆也能弄出來,但首先要完成“-”。如果要寫又得好長,留給你完成吧。到這裡你明白原位加法的重要了吧,這些運算實際上都是靠它實現的。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-981201/,如需轉載,請註明出處,否則將追究法律責任。

相關文章