#include
#include
#include
#define M 20
typedef struct Term
{
      float coef;   //系数
      int exp;   //指数
      struct Term * link;  //指针
}pNode,* Polynomial;

//建立多项式,带有头节点
Polynomial createPoly(int n)
{
      Polynomial head, p , pre ,s;
      float c; //c为系数
      int e,i = 0; //e为指数

      printf("建立多项式单链表\n");
      head = (Polynomial)malloc(sizeof(pNode));
      head->coef = -1;
      head->link = NULL;

      while(i < n){
          printf("输入第%d项\n",++i);
          scanf("%f%d",&c,&e);
          if( c == 0){
              printf("输入的系数为零!\n");
              break;
          }
          s = (Polynomial)malloc(sizeof(pNode));
          s ->coef = c;
          s ->exp = e;
          p = head;
          pre = NULL;
          while(p != NULL && p->exp < e){
              pre = p;
              p = p->link;
          }
          if(p != NULL && p->exp == e)
              printf("输入项的指数重复\n");
          else{
              s ->link = p;
              pre ->link =s;
          }
     }
     return head;
}

//多项式显示
void printPoly(Polynomial poly,int n)
{
     Polynomial s;
     int i = 1;

     s = poly;
     s = s->link;
     while(i
         printf("%.f*x^%d+",s->coef,s->exp);
         s = s->link;
         i ++;
     }
     printf("%.f*x^%d",s->coef,s->exp);
     printf("\n");
}

//多项式的插入
void Insert(Polynomial &poly, float c ,int e,int &n)
{
     Polynomial s = poly, t = NULL, p;

     while(s != NULL && s->exp < e)
    {
         t = s;
         s = s->link;
    }
    if(s != NULL && s ->exp == e){//相同指数,系数合并
         if(s ->coef + c != 0){
              s ->coef = s->coef + c;
         }
         else
        {
             t ->link = s->link;
             free(s);
             n--;//系数之和为0,项数减1
        }
    }
    else{
        p = (Polynomial)malloc(sizeof(pNode));
        p ->exp = e;
        p ->coef = c;
        if(t == NULL)
       {
           p ->link =poly;
           poly = p;
       }
       else{
           t ->link = p;
           p ->link = s;
       }
       n++;
    }
}

//多项式乘法实现
Polynomial Mul(Polynomial a, Polynomial b, int &n)
{
     Polynomial s,t,result;
     n = 0;
 
     result = (Polynomial)malloc(sizeof(pNode));
     result ->exp = -1;
     result ->link = NULL;
     t = b->link;
     while(t !=NULL){
         s = a->link;
         while(s != NULL){
              Insert(result,s->coef*t->coef,s->exp+t->exp,n);
              s = s->link;
         }
     t = t->link;
     }
     return result;
}
void main()

     int n;
     Polynomial mul;

     printf("请输入多项式的项数:");
     scanf("%d",&n);
     Polynomial poly = createPoly(n);
     printf("当前多项式为:");
     printPoly(poly,n);
     printf("插入指数为1,系数为1的项\n");
     Insert(poly,1,1,n);
     printPoly(poly,n);
     printf("多项式相乘\n");
     mul = Mul(poly,poly,n);
     printPoly(mul,n);
     getch();
}