?? p85temp.cpp
字號:
#include <stdio.h> enum Boolean { False, True }; template <class Type> class List; //鏈表類的前視定義 template <class Type> class ListIterator; //鏈表結點類的前視定義 template <class Type> class ListNode { //鏈表結點類的類聲明 friend class List <Type>; //友元 friend class ListIterator <Type>; //友元 friend class Polynomial; friend Polynomial operator + ( const Polynomial & ah, const Polynomial & bh ); public: ListNode ( const Type value ) : data (value), link (NULL) { } //……… private: Type data; ListNode<Type> *link; }; template <class Type> class List { //鏈表類的類聲明 public: friend class ListIterator<Type>; List ( const Type value) { last =first = new ListNode<Type> (value) ; } //構造函數 int sum (); void Add ( const Type value ) ; //……… private: ListNode<Type> *first, *last; }; template <class Type> class ListIterator { //鏈表游標類的類聲明 public: ListIterator ( const List<Type> & l ) : list (l), current (l.first) { } Boolean NotNull ( ); Boolean NextNotNull ( ); ListNode<Type>* First ( ); ListNode<Type>* Next ( ); private: const List<Type> & list; //引用一個已存在的鏈表 ListNode<Type> *current; //指向鏈表中的一個結點 } template <class Type> Boolean ListIterator<Type>::NotNull ( ) { //檢查鏈表中當前元素是否非空 if ( current != NULL ) return True; //鏈表當前結點指針非空 else return False; } template <class Type> Boolean ListIterator<Type>::NextNotNull ( ) { //檢查鏈表中下一元素是否非空 if ( current != NULL && current->link != NULL ) return True; else return False; } template <class Type> ListNode<Type>* ListIterator<Type>::First ( ) { //返回指向鏈表中表頭結點的指針 if ( list.first->link != NULL ) { current = list.first; } else { current = NULL; } return current ; } template <class Type> ListNode<Type>* ListIterator<Type>::Next ( ) { //返回指向鏈表中下一個結點的指針 if ( current != NULL && current->link != NULL ) { current = current->link; } else { current = NULL; } return current; } char compare ( int a, int b ) { if ( a > b ) return '>'; else if ( a == b ) return '='; else return '<'; } struct Term { //用鏈表表示的多項式中, 鏈表結點的定義 int coef; //系數 int exp; //指數 void Init ( int c, int e ) { coef = c; exp = e; } }; class Polynomial { //多項式類的定義 friend Polynomial operator + ( const Polynomial &, const Polynomial & ); private: List<Term> poly; //單鏈表結構, 數據部分是Term }; Polynomial operator + ( const Polynomial & ah, const Polynomial & bh ) { //兩個帶頭結點的按降冪排列的多項式鏈表的頭指針分別是ah和bh, 返回是結果多項式鏈表的表頭指針, //指向ah的表頭結點, 且結果不另外占用存儲, 覆蓋ah和bh鏈表 ListNode<Term> *pa, *pb, *pc, *p; ListIterator<Term> Aiter ( ah.poly ); ListIterator<Term> Biter ( bh.poly ); pa = pc = Aiter.First ( ); pb = Biter.First ( ); //取得ah與bh的表頭結點 pa = Aiter.Next ( ); pb = Biter.Next ( ); //pa、pb是鏈表ah、bh的檢測指針 delete pb; //保留ah的表頭結點, 刪去bh的表頭結點 while ( Aiter.NotNull ( ) && Biter.NotNull ( ) ) //兩兩比較 switch ( compare ( pa->data.exp, pb->data.exp ) ) { case '=' : //pa→exp==pb→exp pa->data.coef = pa->data.coef+pb->data.coef; //系數相加 p = pb; pb = Biter.Next ( ); delete p; //刪去原pb所指結點 if ( !pa->data.coef ) { p = pa; pa = Aiter.Next ( ); delete p; } //相加為零, 不要 else { pc->link = pa; pc = pa; pa = Aiter.Next ( ); } //相加不為零, 加入ch鏈 break; case '<' : //pa→exp < pb→exp pc->link = pb; pc = pb; pb = Biter.Next ( ); break; case '>' : //pa→exp > pb→exp pc->link = pa; pc = pa; pa = Aiter.Next ( ); } if ( Aiter.NotNull ( ) ) pc->link = pa; //剩余部分鏈入ch鏈 else pc->link = pb; return ah; } Polynomial operator * ( const Polynomial & ah, const Polynomial & bh ) void Calc ( ) { Polynomial a, b, c, d, t; cin >> a; cin >> b; cin >> c; //讀入3個多項式 t = a * b; d = t + c; cout << d; }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -