熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> 數據結構 >> 正文

數據結構學習講座(C++) 單鏈表(2)

2022-06-13   來源: 數據結構 

單鏈表(

 單鏈表應用

  有人曾經建議最好把鏈表和鏈表位置這兩個分開C++標准庫是這麼做的但對於初學者來說一個類總比兩個類好操作我不清楚在書中這部分的程序究竟調沒調試但這種語句我是絕對看不懂的

ListNode<Term> *pa *pb *pc *p;
ListIterator<Term> Aiter(ahpoly);
ListIterator<Term> Biter(ahpoly);
pa = pc = AiterFirst(); pb = p = BiterFirst();
………………………
pa>coef = pa>coef + pb>coef;
p = pb; pb = BiterNext(); delete p;

  pa pb p 究竟指向什麼?你說這很清楚ListNode<Term>這樣的節點呗但按照原書的定義ListIterator::First()等等函數返回是指向data域的指針他們怎麼能直接賦值?到了下面更亂了pb指向的區域直接分解出了Term的數據成員也就是說是指向Term結構的然後讓ListNode<Term>類型的指針p指向這個Term結構最後居然把這個結構delete了天啊ListNode<Term>這樣的節點的data域被delete了!

  如果從基本的節點操作入手誰也不會弄的這麼亂但正因為又多了一個類很多事就疏忽了所以我並不懷疑標准庫的做法只是對於初學者同一時間最好只對一個類操作我以我的定義為基礎重新完成了這段程序我並不欣賞原位操作的多項式加法(+)PolyA+PolyB然後B就嗖的一下沒了A就多了一堆(也可能少了一堆)你作intJ+intK的時候怎麼沒見J和K有什麼變化與其這樣重載+還不如寫成PolyAAdd(PolyB)或者PolyAdd(PolyAPolyB)

  一元多項式類定義與實現

#ifndef Polynomial_H
#define Polynomial_H

#include Listh
class Term
{
 public:
  int coef;
  int exp;
  Term() : coef() exp() {}
  Term(int c int e) : coef(c) exp(e) {}
  Term(int c) : coef(c) exp() {}
};

class Polynomial : List<Term>
{
 public:
  void Input()
  {
   cout << endl << 輸入多項式的各項系數和指數;
   cout << endl << 注意請按降序輸入各項輸入系數表示結束 << endl;
   int coef exp;
   for(int i = ; ; i++)
   {
    cout << << i << 項的系數;
    cin >> coef;
    if (coef)
    {
     cout << 指數;
     cin >> exp;
     Term term(coef exp);
     Insert(term);
    }
    else break;
   }
  }
 void Print()
 {
  cout << endl;
  First();
  if (!IsEmpty())
  {
   Term *p = Next();
   cout << p>coef;
   if (p>exp)
   {
    cout << x;
    if (p>exp != ) cout << ^ << p>exp;
   }
  while (Next() != NULL)
  {
   p = Get();
   if (p>coef > ) cout << +;
   cout << p>coef;
   if (p>exp)
   {
    cout << x;
    if (p>exp != ) cout << ^ << p>exp;
   }
  }
 }
 cout << endl;
}
friend void PolyAdd (Polynomial &polyA Polynomial &polyB)
{
 Node<Term> *pA *pB;
 polyAFirst();polyBFirst();
 pA = polyApNext();pB = polyBpNext();
 while (pA != NULL && pB !=NULL)
 {
  if (pA>dataexp == pB>dataexp)
  {
   pA>datacoef = pA>datacoef + pB>datacoef;
   polyBRemove();
   if (!pA>datacoef) polyARemove();
   else polyApNext();
  }
  else
  {
   if (pA>dataexp > pB>dataexp)
   {
    polyBpRemove();
    polyAInsertBefore(pB);
   }
   else if (pA>dataexp < pB>dataexp) polyApNext();
  }
  pA = polyApGet();pB = polyBpGet();
 }
 if (pA == NULL)
 {
  polyApGetPrior()>link = pB;
  polyBpGetPrior()>link = NULL;
 }
}
};
#endif 

  【說明】對於多項式通常我們都是降序書寫的於是我就要求降序輸入但是對於做加法來說確實升序的要方便一些於是實際上到了內部就變成升序的了對於輸出格式(從C的時候我就不喜歡做這個)盡量照顧習慣但是當非常數項系數為的時候還是會輸出系數的我實在不想把一個實際應用中根本拿不出台的輸出函數搞的很復雜為我編起來方便輸出變成了升序的請多包含測試程序就不給了很簡單在續篇中我將完成一元多項式×的重載——為什麼沒有÷這種運算我拿筆算都不麻利編起來就更鬧心了我還清楚的記得拿匯編寫多字節除法程序時的痛苦到了下一篇你就可以這樣寫了a=b+c*d;aPrint()

  在下面將會有些重載運算符的例子我們的工作將是使多項式的運算看起來更符合書寫習慣完成這些是我覺得我擅自將原書的改成了PolyAdd()總要給個交待吧


From:http://tw.wingwit.com/Article/program/sjjg/201311/22943.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.