链表,多项式求和

一道普通的大作业题我竟然折腾了这么久,汗颜啊!

#include <iostream>
using namespace std;
class Poly;
class node
{
    private:
     int coef;//系数
     int exp;//指数
     node *next;
     friend Poly;
     friend void  calculate(Poly &x,Poly &y);
};
class Poly
{
   private:
    node* head;
   public:
    void creat();
    void print();
    void Delete();
    node* Returnhead();
    void print2();
};
void Poly::creat()
{
    node *tail,*p;
    int a,b;
    cout<<"请输入多项式"<<endl;
    p=new node;
    p->exp=0;
    p->coef=0;
    p->next=NULL;
    head=tail=p;
    while(cin>>a>>b&&b>0)
    {
        p=new node;
        p->coef=a;
        p->exp=b;
        p->next=NULL;
        tail->next=p;
        tail=p;
    }
}
node* Poly::Returnhead()
{
    if (head->next)
    return head;
    else
    return NULL;


}
void calculate(Poly &x,Poly &y)
{
    node *p1,*p,*q,*temp;
    p1=x.Returnhead();
    p=p1->next;
    q=y.Returnhead()->next;
   while(q&&p)
   {
     if (p->exp==q->exp)
     {
         p->coef+=q->coef;
          if (p->coef==0)
         {
           p1->next=p->next;
           delete(p);
           p=p1->next;
         }
        else
         {
            p1=p;
            p=p->next;
         }
        q=q->next;//不管怎么样,q1都要向后移
     }
     else
      if (p->exp<q->exp)
     {
         temp=new node;
         temp->coef=q->coef;
         temp->exp=q->exp;
         p1->next=temp;
         temp->next=p;
         q=q->next;
      }
      else
      {
          p1=p;
          p=p->next;
      }
   }
   while(q)
   {
       node*temp;
       temp=new node;
       temp=q;
       p1->next=temp;
       p1=temp;
       q=q->next;
   }
}
void Poly::print()
{
    node*p;
    p=head->next;
   if (p->coef==1)
        cout<<"x"<<'^'<<p->exp;
    else
        if (p->coef==-1)
        cout<<"-x"<<'^'<<p->exp;
        else
         if (p->coef==0)
          p=p->next;
          else
            cout<<p->coef<<'x'<<'^'<<p->exp;
            p=p->next;
    while(p)
    {
       if (p->coef==1)
        cout<<'+'<<'x'<<'^'<<p->exp;
      else
        if (p->coef==-1)
        cout<<"-x"<<'^'<<p->exp;
        else
         if (p->coef==0)
          p=p->next;
          else
            if (p->coef>0)
            cout<<'+'<<p->coef<<'x'<<'^'<<p->exp;
          else
            cout<<p->coef<<'^'<<p->exp;
            p=p->next;
    }
}
void Poly::print2()
{   node *p;
     p=head->next;
     while(p)
    {
       if (p->coef==1)
        cout<<'+'<<'x'<<'^'<<p->exp;
      else
        if (p->coef==-1)
        cout<<"-x"<<'^'<<p->exp;
        else
         if (p->coef==0)
          p=p->next;
          else
            if (p->coef>0)
            cout<<'+'<<p->coef<<'x'<<'^'<<p->exp;
          else
            cout<<p->coef<<'^'<<p->exp;
            p=p->next;
    }
}
void Poly::Delete()
{

    node *p=head,*q;
    while(p)
    {
      q=p->next;
      delete(p);
      p=q;
    }
    cout<<"内存已释放成功"<<endl;
}
int main()
{

    Poly A,B;
    A.creat();
    cout<<"A的表达式为:";
    A.print();
    cout<<endl;
    B.creat();
    cout<<"B的表达式为:";
    B.print();
    cout<<endl;
    cout<<"计算的多项式结果为:"<<endl;
    A.print();
    B.print2();
    cout<<"=";
    calculate(A,B);
   if (A.Returnhead()==NULL)
        cout<<0<<endl;
    else
    A.print();
    cout<<endl;
    A.Delete();
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用链表实现一元多项式求和的代码,需要输入多项式项数和各项系数和指数。 #include<stdio.h> #include<stdlib.h> struct PolyNode{ int coef;//系数 int expon;//指数 struct PolyNode *link;//链指针 }; typedef struct PolyNode *Polynomial; Polynomial readPoly();//读取多项式 void attach(int c, int e, Polynomial *pRear);//新建节点 Polynomial add(Polynomial p1, Polynomial p2);//多项式加法 void printPoly(Polynomial P);//输出多项式 int main(){ Polynomial P1, P2, PP; P1 = readPoly(); P2 = readPoly(); PP = add(P1, P2); printPoly(PP); return 0; } Polynomial readPoly(){ Polynomial P, Rear, t; int c, e, N; scanf("%d", &N); P = (Polynomial)malloc(sizeof(struct PolyNode));//头节点 P->link = NULL; Rear = P; while(N--){ scanf("%d %d", &c, &e); attach(c, e, &Rear);//在Rear之后插入一个节点 } t = P; P = P->link; free(t);//释放头节点 return P; } void attach(int c, int e, Polynomial *pRear){ Polynomial P; P = (Polynomial)malloc(sizeof(struct PolyNode)); P->coef = c; P->expon = e; P->link = NULL; (*pRear)->link = P; *pRear = P; } Polynomial add(Polynomial p1, Polynomial p2){ Polynomial front, rear, temp; int sum; rear = (Polynomial)malloc(sizeof(struct PolyNode)); front = rear; while(p1 && p2){ if(p1->expon > p2->expon){ attach(p1->coef, p1->expon, &rear); p1 = p1->link; } else if(p1->expon < p2->expon){ attach(p2->coef, p2->expon, &rear); p2 = p2->link; } else{ sum = p1->coef + p2->coef; if(sum) attach(sum, p1->expon, &rear); p1 = p1->link; p2 = p2->link; } } for(; p1; p1 = p1->link) attach(p1->coef, p1->expon, &rear); for(; p2; p2 = p2->link) attach(p2->coef, p2->expon, &rear); rear->link = NULL; temp = front; front = front->link; free(temp);//释放头节点 return front; } void printPoly(Polynomial P){ int flag = 0; if(!P){ printf("0 0\n"); return; } while(P){ if(!flag) flag = 1; else printf(" "); printf("%d %d", P->coef, P->expon); P = P->link; } printf("\n"); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值