# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>


typedef struct  LNode
{
  int  coef;
  int  exp;
  struct  LNode *next;
}node;


node *Createlist()//创建一元多项式链表
{
  node *head,*middle,*s;//新定义三个链表head作为返回,middle作为中间变量,s为新插入项;
  int  coef, exp;
  head = (node *)malloc(sizeof(node));
  if (!head)
  {
    exit(-1);
  }
  head->next = NULL;
  middle = head;
  printf("请输入每一项的系数和指数:");
  scanf("%d%d",&coef,&exp);
  while (!((coef==0)&&(exp==0)))//当系数和指数都为0时,多项式结束
  {
    s = (node *)malloc (sizeof(node));
    if (!s)
    {
      exit(-1);
    }
    s->coef = coef;
    s->exp = exp;
    s->next = middle->next;
    middle->next = s;
    middle = s;
   printf("请继续输入:");
    scanf("%d%d",&coef,&exp);
  }
  return head;


}


void Listadd(node *listya, node *listyb)//ya=a1*x^t1+a2*x^t2;yb=b1*x^n1+b2*x^n2
{
  node *p, *q, *pre, *temp;
  int  sum = 0;;
  p = listya->next;
  q = listyb->next;
  pre = listya;
  while (p && q)
  {
    if (p->exp < q->exp)
    {
      pre->next = p;
      pre = p;
      p = p->next;
    }
    else if (p->exp > q->exp)
    {
      pre->next = q;
      pre = q;
      q = q->next;
    }
    else
    {
      sum = p->coef + q->coef;
      if (sum)
      {
        p->coef = sum;
        pre->next = p;
        pre = p;
        p = p->next;


        temp = q->next;
        free(q);  //将yb链中相应项释放掉,和放到ya链中
        q = temp;
      }
      else
      {
        temp = p->next;
        free(p);
        p = temp;
        temp = q->next;
        free(q);
        q = temp;
      }
    }
  }
  pre->next = p?p:q;
}


int Print(node *h)
{
  node *p = h->next;
  if(p)
  {
       printf("%d*x^%d",p->coef, p->exp);
       p=p->next;
  }
  while (p)
  {
    printf("+%d*x^%d",p->coef, p->exp);
    p = p->next;
  }
  printf("\n");
  return 1;
}


int main()
{
  node *listya, *listyb;
  printf("输入结束标志位系数和指数同为0 \n");
  printf("请输入第一个一元多项式的系数和指数\n");
  listya = Createlist();
  printf("你输入的第一个一元多项式为:");
  Print(listya);
  printf("请输入第二个一元多项式的系数和指数\n");
  listyb = Createlist();
  printf("你输入的第二个一元多项式为:");
  Print(listyb);
  printf("两个一元多项式相加后的结果为:");
  Listadd(listya, listyb);
  Print(listya);
  return 1;
}单链表实现一元多项式相加

相关文章: