一元多项式的加减

来源:互联网 发布:递推算法求韩信点兵 编辑:程序博客网 时间:2024/04/30 10:48


#include<stdio.h>
#include<stdlib.h>
typedef struct nodetype
{
 float coef;
 int expn;
 struct nodetype *next;
}nodetype;
nodetype *creatpoly()
{
    nodetype *head,*rear,*s;
 float c;
 int e;
    head=(nodetype *)malloc(sizeof(nodetype));
 head->next=NULL;
    rear=head;
    printf("请输入多项式的系数和指数,用空格隔开,系数为0时结束输入,指数按从小到大的顺序输入\n");
 scanf("%f%d",&c,&e);
 while(c!=0)
 {
  s=(nodetype *)malloc(sizeof(nodetype));
  s->coef=c;
  s->expn=e;
  rear->next=s;
  rear=s;
  printf("请输入多项式的系数和指数,用空格隔开,系数为0时结束输入,指数按从小到大的顺序输入\n");
  scanf("%f%d",&c,&e);
 }
 rear->next=NULL;
 return (head);
}
nodetype *printpoly(nodetype *head)
{
   nodetype *q;
 q=head->next;
 int flag=1;
 if(!q)
 {
  putchar('0');
  printf("\n");
  return head;
 }
 while(q)
 {
      if(q->coef>0&&flag!=1)
    putchar('+');
   if(q->coef!=1&&q->coef!=-1)
   {
    printf("%g",q->coef);
    if(q->expn==1)
     putchar('X');
    else if(q->expn)
     printf("X^%d",q->expn);
   }
   else
   {
    if(q->coef==1)
    {
     if(!q->expn)
      putchar('1');
     else if(q->expn==1)
      putchar('X');
              else
                  printf("X^%d",q->expn);
    }
    if(q->coef==-1)
    {
     if(!q->expn)
               printf("-1");
     else if(q->expn==1)
      printf("-X");
     else
      printf("-X^%d",q->expn);
    }
   }
   q=q->next;
   flag++;
 }
 printf("\n");
 return head;
}

 nodetype *addpoly(nodetype *ahead,nodetype *bhead)
{

     nodetype *pa,*pb,*chead,*pc,*qc;
   pa=ahead->next;
   pb=bhead->next;
      pc=(nodetype *)malloc(sizeof(nodetype));
   pc->next=NULL;
   chead=pc;
   while(pa!=NULL&&pb!=NULL)
   {
        qc=(nodetype *)malloc(sizeof(nodetype));
       if (pa->expn<pb->expn)
  {
   qc->coef=pa->coef;
   qc->expn=pa->expn;
   pa=pa->next;
  }
  else if(pa->expn>pb->expn)
  {
   qc->coef=pb->coef;
   qc->expn=pb->expn;
   pb=pb->next;
  }
  else
  {
   qc->coef=pa->coef+pb->coef;
   qc->expn=pa->expn;
   pa=pa->next;
   pb=pb->next;
  }
  if(qc->coef!=0)
  {
   qc->next=pc->next;
   pc->next=qc;
   pc=qc;
  }
  else
   free(qc);
   }
   while(pa!=NULL)
   {
          qc=(nodetype *)malloc(sizeof(nodetype));
       qc->coef>=pa->coef;
       qc->expn=pa->expn;
          pa=pa->next;
    qc->next=pc->next;
    pc->next=qc;
    pc=qc; 
   }
      while(pb!=NULL)
   {
          qc=(nodetype *)malloc(sizeof(nodetype));
       qc->coef>=pb->coef;
          qc->expn=pb->expn;
    qc->next=pc->next;     
          pb=pb->next;
    pc->next=qc;
    pc=qc;
   }
   return chead;
}
nodetype *jianpoly(nodetype *ahead,nodetype *bhead)
{
    nodetype *h,*p,*chead;
 h=bhead;
 p=bhead->next;
 while(p!=NULL)
 {
  p->coef=p->coef*(-1);
  p=p->next;
 }
 chead=addpoly(ahead,h);
 for(p=h->next;p;p=p->next)
  p->coef*=-1;
 return chead;
}
int main(void)
{
  nodetype *ahead,*bhead,*chead;
 int choice;
 printf("建立A多项式\n");
    ahead=creatpoly();
 printf("建立B多项式\n");
 bhead=creatpoly();
 printf("多项式a为\n");
    ahead=printpoly(ahead);
     printf("多项式b为\n");
    bhead=printpoly(bhead);
 printf("请选择您要进行的运算,进行加法请按‘1’,进行减法请按2,如要退出请按0\n");
 printf("请输入您的选择\n");
 scanf("%d",&choice);
 while(choice!=0)
 {
  if(choice==1)
  {
          chead=addpoly(ahead,bhead);
    chead=printpoly(chead);
  }
  else if(choice==2)
  {
   chead=jianpoly(ahead,bhead);
   chead=printpoly(chead);
  }
  else
  {
   printf("输入错误请重新输入\n");
   scanf("%d",&choice);
  }
      printf("请输入您的选择\n");
        scanf("%d",&choice); 
 }
    return 0;
}


 

0 0