PTA 1002. A+B for Polynomials C++ 链表实现

提示:问题主要出在格式上面。

1,当多项式相加系数全部抵消时,输出应该为 0,而不是为 0 0 0.0 之类的。即只需输出项数。

2,输出的系数的小数部分可能超过一位,输出是应该保留一位小数。

#include <iostream>
#include <iomanip>

using namespace std;
struct Data//多项式的数据类型
{
    int exp;//指数
    double coe;//系数
};

typedef Data ElemType;

struct NodeType //多项式节点
{
    ElemType data;
    NodeType * next;
};


//单链表
class LinkList{
private:
    NodeType *Head;
    int lenth;
public:
    LinkList();
    ~LinkList();
    void Creat();
    void Print();
    void Insert(int i,ElemType x);
    ElemType Delete(int i);
    NodeType* GetHead();

};
LinkList::LinkList()
{
  Head = new NodeType;
  Head->next = NULL;
  Head->data.coe = 0;
  Head->data.exp = 0;
}
LinkList::~LinkList()
{
  NodeType *p = Head->next;
  while(p!= NULL)
    {
        Head->next = p->next;
        delete p;
        p = Head->next;
    }
  delete Head;
}
void LinkList::Creat()
{
  NodeType *last = Head,*p;
  int i = 0,x;
  double y;
  cin >> i ;
  for(int j = 0;j<i;j++)
  {
      cin >> x >> y;
      p = new NodeType;
      p->data.exp = x;
      p->data.coe = y;
      p->next = NULL;
      last->next = p;
      last = p;
      p = NULL;
  }
}
NodeType* LinkList::GetHead()
{
    return Head;
}

//多项式相加函数
NodeType * polyAdd(LinkList &a,LinkList &b) 
{
    //为了节省节点空间,在此不创建新节点,利用链表a,b的节点生成新节点。r指向新生成的节点,p指向a链表的当前节点,q指向b链表的当前节点。rt返回新建节点的头节点地址。
     NodeType *r,*p,*q,*rt;
     r = a.GetHead();
     rt = r;
     p = r->next;
     q = b.GetHead()->next;
     while(p!= NULL && q!= NULL)
     {
         if(p->data.exp == q->data.exp)
         {
             double x = p->data.coe+q->data.coe;
             if(x == 0)
                r->next = p->next;
             else
                {
                    p->data.coe = x;
                    r->next = p;
                    r = p;
                }
             p = p->next;
             q = q->next;
         }
         else if(p->data.exp > q->data.exp)
         {
            r->next =p;
            r = p;
            p = p->next;
         }
         else
         {
             r->next = q;
             r = q;
             q = q->next;
         }
     }
     if(p == NULL)
        r->next = q;
     else
        r->next = p;
    return rt;
}
void Print(NodeType *p)
{
    int counter = 0;
    NodeType *q = p->next;
    p = p->next;

     while(q!= NULL)
    {
        q = q->next;
        counter++;
    }
    cout << counter;
     while(p!=NULL)
    {

            cout << " " << p->data.exp <<" " <<setiosflags(ios::fixed)<<setprecision(1) << p->data.coe ;
        p = p->next;
    }

}

int main()
{

    LinkList poly1,poly2;
    NodeType * np;
    poly1.Creat();
    poly2.Creat();
    np =polyAdd(poly1,poly2);
    Print(np);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37637619/article/details/82890918