#include<stdio.h>
 #include<stdlib.h>
 typedef struct
 {
  int x;
  int y;
  struct *next;
 }node;
 void create1(node **phead,int i,int n)                        一元多项式的建立
   { 
  int a,b;
     node *p1, *p2, *q; 
     p2 = *phead; 
     p1 = NULL; 
     while (p2!= NULL) { 
       p1 = p2; 
       p2 = p2->next; 
     } 
     q= (node *)malloc(sizeof(node)); 
     printf("输入第%d项的系数,指数:  ",i);
     scanf("%d%d",&a,&b);
     q->x=a; 
     q->y=b;
     q->next = p2; 
     if (p1 == NULL) 
  { 
       *phead= q; 
     } 
  else 
  { 
       p1->next = q; 
     } 
  } 
 void sort(node *phead)                             对多项式进行排序
 {
  node *p,*q;
  int t;
  p=q=phead;
  for(p=phead;p->next!=NULL;p=p->next)
  {
   for(q=p;q!=NULL;q=q->next)
   {
    if(p->y>q->y)
    {
     t=p->y;
     p->y=q->y;
     q->y=t;
     t=p->x;
     p->x=q->x;
     q->x=t;
    }
   }
  }
 }
 void print(node *head)
 {
  node *p;
  p=head;
  while(p->next!=NULL)
  {
   printf("%dX^%d",p->x,p->y);
   p=p->next;
   if(p->x>0)
    printf("+");
  }
  printf("%dX^%d",p->x,p->y);
 }
 void plus(node *phead1,node *phead2,int n)            多项式的相加
 {
  node *p,*q,*p1,*p2;
  node a[100];
  int i=0;
  p=phead1;
  q=phead2;
  while(p!=NULL&&q!=NULL)
  { 
   if(p->y==q->y)
   {
    a[i].x=p->x+q->x;
    a[i].y=p->y;
    i++;
    n--;
    p=p->next;
    q=q->next;
   }
   else if(p->y>q->y)
   {
    a[i].x=q->x;
    a[i].y=q->y;
    i++;
    q=q->next;
   }
   else
   {
    a[i].x=p->x;
    a[i].y=p->y;
    i++;
    p=p->next;
   }
  }
  while(p!=NULL)
  {
   a[i].x=p->x;
   a[i].y=p->y;
   i++;
   p=p->next;
  }
  while(q!=NULL)
  {
   a[i].x=q->x;
   a[i].y=q->y;
   i++;
   q=q->next;
  }
  printf("\n");
  printf("多项式的和为:  ");
  for(i=0;i<n;i++)
  {
   printf("%dX^%d",a[i].x,a[i].y);
   if(a[i+1].x>0)
    printf("+");
  }
  printf("\n");
 }
 void minus(node *phead1,node *phead2,int n)             多项式的相减
 {
  node *p,*q;
  node a[100];
  int i=0;
  p=phead1;
  q=phead2;
  while(p!=NULL&&q!=NULL)
  { 
   if(p->y==q->y)
   {
    a[i].x=p->x-q->x;
    a[i].y=p->y;
    i++;
    n--;
    p=p->next;
    q=q->next;
   }
   else if(p->y>q->y)
   {
    a[i].x=-(q->x);
    a[i].y=q->y;
    i++;
    q=q->next;
   }
   else
   {
    a[i].x=p->x;
    a[i].y=p->y;
    i++;
    p=p->next;
   }
  }
  while(p!=NULL)
  {
   a[i].x=p->x;
   a[i].y=p->y;
   i++;
   p=p->next;
  }
  while(q!=NULL)
  {
   a[i].x=-(q->x);
   a[i].y=q->y;
   i++;
   q=q->next;
  }
  printf("\n");
  printf("多项式的差为:  ");
  for(i=0;i<n;i++)
  {
   printf("%dX^%d",a[i].x,a[i].y);
   if(a[i+1].x>0)
    printf("+");
  }
  printf("\n");
 }
 int main(void)
 {
  int i,n1,n2,t;
  node *head1,*head2; 
  printf("输入第一个式子项的数目:");
  scanf("%d",&n1);
  for (i = 1,head1 = NULL;i <= n1;i++) 
   create1(&head1, i, n1); 
  sort(head1);
  printf("第一个多项式为:  ");
  print(head1);
  printf("\n输入第二个式子项的数目:");
  scanf("%d",&n2);
  for (i = 1,head2 = NULL;i <= n2;i++) 
   create1(&head2, i, n2);
  sort(head2);
  printf("第二个多项式为:  ");
  print(head2);
  plus(head1,head2,n1+n2);
  minus(head1,head2,n1+n2);
 }