p85temp.cpp
上传用户:chaiyuqiu
上传日期:2022-08-03
资源大小:27k
文件大小:4k
源码类别:

数据结构

开发平台:

C/C++

  1. #include <stdio.h>
  2. enum Boolean { False, True };
  3. template <class Type> class List; //链表类的前视定义
  4. template <class Type> class ListIterator; //链表结点类的前视定义
  5. template <class Type> class ListNode { //链表结点类的类声明
  6. friend class List <Type>; //友元
  7. friend class ListIterator <Type>; //友元
  8. friend class Polynomial;
  9. friend Polynomial operator + ( const Polynomial & ah, const Polynomial & bh );
  10. public:
  11.    ListNode ( const Type value ) : data (value), link (NULL) { }
  12.    //………
  13. private:
  14.    Type data;
  15.    ListNode<Type> *link;
  16. };
  17. template <class Type> class List { //链表类的类声明
  18. public:
  19.    friend class ListIterator<Type>;
  20.    List ( const Type value) { last =first = new ListNode<Type> (value) ; } //构造函数
  21.    int sum ();
  22.    void Add ( const Type value ) ;
  23.    //………
  24. private:
  25.    ListNode<Type> *first, *last;
  26. };
  27. template <class Type> class ListIterator { //链表游标类的类声明
  28. public:
  29.    ListIterator ( const List<Type> & l ) : list (l), current (l.first) { }
  30.    Boolean NotNull ( );
  31.    Boolean NextNotNull ( );
  32.    ListNode<Type>* First ( );
  33.    ListNode<Type>* Next ( );
  34. private:
  35.    const List<Type> & list; //引用一个已存在的链表
  36.    ListNode<Type> *current; //指向链表中的一个结点
  37. }
  38. template <class Type> Boolean ListIterator<Type>::NotNull ( ) {
  39. //检查链表中当前元素是否非空
  40.    if ( current != NULL ) return True;  //链表当前结点指针非空
  41.    else return False;
  42. }
  43. template <class Type> Boolean ListIterator<Type>::NextNotNull ( ) {
  44. //检查链表中下一元素是否非空
  45.    if ( current != NULL && current->link != NULL ) return True;
  46.    else return False;
  47. }
  48. template <class Type> ListNode<Type>* ListIterator<Type>::First ( ) {
  49. //返回指向链表中表头结点的指针
  50.    if ( list.first->link != NULL ) { current = list.first; }
  51.    else { current = NULL; }
  52.    return current ;
  53. }
  54. template <class Type> ListNode<Type>* ListIterator<Type>::Next ( ) {
  55. //返回指向链表中下一个结点的指针
  56.    if ( current != NULL && current->link != NULL ) { current = current->link; }
  57.    else { current = NULL; }
  58.    return current;
  59. }
  60. char compare ( int a, int b ) {
  61.     if ( a > b ) return '>';
  62.     else if ( a == b ) return '=';
  63.     else return '<';
  64. }
  65. struct Term { //用链表表示的多项式中, 链表结点的定义
  66.    int coef; //系数
  67.    int exp; //指数
  68.    void Init ( int c, int e ) { coef = c;  exp = e; }
  69. };
  70. class Polynomial { //多项式类的定义
  71. friend Polynomial operator + ( const Polynomial &, const Polynomial & );
  72. private:
  73.    List<Term> poly; //单链表结构, 数据部分是Term
  74. };
  75. Polynomial operator + ( const Polynomial & ah, const Polynomial & bh ) {
  76. //两个带头结点的按降幂排列的多项式链表的头指针分别是ah和bh, 返回是结果多项式链表的表头指针,
  77. //指向ah的表头结点, 且结果不另外占用存储, 覆盖ah和bh链表
  78.    ListNode<Term> *pa, *pb, *pc, *p;
  79.    ListIterator<Term> Aiter ( ah.poly );
  80.    ListIterator<Term> Biter ( bh.poly );
  81.    pa = pc = Aiter.First ( );  pb = Biter.First ( ); //取得ah与bh的表头结点
  82.    pa = Aiter.Next ( );  pb = Biter.Next ( ); //pa、pb是链表ah、bh的检测指针
  83.    delete pb; //保留ah的表头结点, 删去bh的表头结点
  84.    while ( Aiter.NotNull ( ) && Biter.NotNull ( ) ) //两两比较
  85.   switch ( compare ( pa->data.exp, pb->data.exp ) ) {
  86. case '=' : //pa→exp==pb→exp
  87.    pa->data.coef = pa->data.coef+pb->data.coef; //系数相加
  88.    p = pb;  pb = Biter.Next ( );  delete p; //删去原pb所指结点
  89.    if ( !pa->data.coef ) { p = pa;  pa = Aiter.Next ( );  delete p; } //相加为零, 不要
  90.    else { pc->link = pa;  pc = pa;  pa = Aiter.Next ( ); } //相加不为零, 加入ch链
  91.    break;
  92. case '<' : //pa→exp < pb→exp
  93.    pc->link = pb;  pc = pb;  pb = Biter.Next ( );
  94.    break;
  95. case '>' : //pa→exp > pb→exp
  96.    pc->link = pa;  pc = pa;  pa = Aiter.Next ( );
  97.   }
  98.    if ( Aiter.NotNull ( ) )  pc->link = pa; //剩余部分链入ch链
  99.    else  pc->link = pb;
  100.    return ah;
  101. }
  102. Polynomial operator * ( const Polynomial & ah, const Polynomial & bh )
  103. void Calc ( ) {
  104.    Polynomial a, b, c, d, t;
  105.    cin >> a;  cin >> b;  cin >> c; //读入3个多项式
  106.    t = a * b;  d = t + c;
  107.    cout << d;
  108. }