一元多项式加法

来源:互联网 发布:农村是一种负担知乎 编辑:程序博客网 时间:2024/06/05 09:15


/*用链表是实现一元多项式的加法,新生成的链表存储在原有链表之一中*/

#include <stdio.h>
#include <stdlib.h>
//定义多项式的存储结构
typedef struct ploy
{
 float coef;   //系数
 int exp;   //指数
 struct ploy *next; //指向下一个结点的指针
};  
//创建具有指定节点个数的带头结点链表(表达式有n项)
ploy *crePoly()
{
 ploy *q, *p, *head;
 int n;
 printf("\n请输入多项式的项数:");
 scanf("%d",&n);
 head = (ploy *)malloc(sizeof(ploy));
 if(!head)
 {
  printf("申请内存失败!");
  exit(0);
 }
 head->next = NULL;
 //q指向当前节点,p指向新生成的节点
 q = head;
 for(int i = 1; i <= n; i ++)
 {
  p = (ploy *)malloc(sizeof(ploy));
  printf("系数:");
  scanf("%f",&p->coef);
  printf("指数:");
  scanf("%d",&p->exp);
  q->next = p;
  q = p;
  q->next = NULL;
 }
 return(head);
}
//系数比较函数
int cmp(ploy *ployna, ploy *ploynb)
{
 if(ployna->exp > ploynb->exp)
  return 1;
 else if(ployna->exp < ploynb->exp)
  return -1;
 else
  return 0;
}

//输出多项式
void print(ploy *p)
{
 while(p->next != NULL)
 {
  p = p->next;
  printf("%.0f*X^%d",p->coef,p->exp);
  if(p->next != NULL)
   printf("+");
 }
}

/*多项式相加的函数,相加的结果保存到链表plonyna中,删除ploynb*/
void ploynadd(ploy *ployna, ploy *ploynb)
{
 ploy *p,*q,*pa,*temp,*qb;
 p = ployna->next; //p指向ployna的第一个节点
 q = ploynb->next; //q指向ployna的第一个节点
 pa=ployna;   //pa指向q的前驱
 qb = q;
 int sum;
 while(p != NULL && q != NULL)  //当两个多项式均未扫描到最后一项时
 {
  switch(cmp(p, q))
  {
   case 1: 
     pa = pa->next;
     p = p->next;
     break;
   case -1:
     qb = qb->next;
     pa->next = q;
     q->next = p;
     q = qb;
     pa = pa->next;
     break;
   case 0: 
     sum = p->coef + q->coef;
     if(sum != 0) //系数和不为0时,删除q节点
     {
      p->coef=sum;
      pa = pa->next;
      p = p->next;
      temp = q;
      q=q->next;
      qb=q;
      free(temp);
     }
     else //系数和为0时,同时删除两个节点p和q
     {
      temp=p->next; free(p);p=temp;
      temp=q->next; free(q);q=temp;
     }
     break;
  }
 }
 if(p!=NULL)  //多项式A中还有剩余,则将剩余的结点加入到和多项式中
           pa->next=p;
    else        //否则将B的结点加入到和多项式中
           pa->next=q; 
}
/*主函数*/
void main()
{
 printf("请按照指数从大到小的顺序输入\n");
 ploy *ployna,*ploynb;
 ployna = crePoly();
 print(ployna);
 ploynb = crePoly();
 print(ploynb);
 printf("\n");
 ploynadd(ployna,ploynb);
 print(ployna);
 printf("\n");
 
}

 

原创粉丝点击