数据与结构-一元二次多项式

#include<stdio.h>
#include<stdlib.h>
typedef struct 
{
    float coef;
    int expn;
    struct Polynomial* next;
}Polynomial;

//建立多项式 
Polynomial *CreatePoly()
{
    Polynomial *head,*rear,*s;
    int c,e;
    head = (Polynomial *)malloc(sizeof(Polynomial));//建立多项式的头结点
    rear = head;//rear始终指向单链表的尾部,便于尾插法建表
    scanf("%d,%d",&c,&e);//键入多项式的系数项和指数项
    while(c!=0)//若c=0,则代表多项式键入结束 
    {
        s=(Polynomial *)malloc(sizeof(Polynomial));
        s->coef=c;
        s->expn=e;
        rear->next=s;
        rear=s;
        scanf("%d,%d",&c,&e);
     } 
     rear->next=NULL;//将表中最后一个节点的next置为空 
    
     return head;
}
//输出多项式 
void PrintPolyn(Polynomial *p)
{
    Polynomial *q; 
    q=p->next;
    int flag=1;
    if(!q)//删除掉所有的带0元素 
    {
        putchar('0');
        printf("\n");
        return;
    }
    while(q)//全是数据,非0数,所以一直为真 
    {
        if(q->coef>0&&flag!=1)
        putchar('+');
        if(q->coef!=1&&q->coef!=-1)
        {
            //打印系数 
            printf("%g",q->coef);//自动舍弃小数点后面的0
            if(q->next==1)
            putchar('X');
            else if(q->expn)//只要指数项非0就可以执行 
            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");
}
//两个多项式相加
//coef--系数
//expn--指数 
 Polynomial *AddPolyn(Polynomial *pa,Polynomial *pb)
 {
     Polynomial *qa=pa->next;
     Polynomial *qb=pb->next;
     Polynomial *headc,*pc,*qc;
     pc=(Polynomial *)malloc(sizeof(Polynomial));//单链表pc用来存放pa+pb的和
    pc->next=NULL;
    headc=pc;
    while(qa!=NULL&&qb!=NULL)
    {
    qc=(Polynomial *)malloc(sizeof(Polynomial));
    //前一个多项式的的指数小于后一项时;可以直接进行加法运算,但是并不会合并,任然是两个同的多项式 
    if(qa->expn<qb->expn)//规则一 
    {
        qc->coef=qa->coef;
        qc->expn=qa->expn;
        qa=qa->next;
        }    
        //如果两个多项式指数相等,则系数可以直接进行加法运算,将两项合并 
        else if(qa->expn==qb->expn)//规则2 
        {
            qc->coef=qa->coef+qb->coef;
            qc->expn=qa->expn;
            qa=qa->next;
            qb=qb->next;
        }
        //虽然没有if语句判断条件,但可以明显看出条件是 qa->expn > qb->expn,结果仍为两个多项式,不会合并 
        else//规则3 
        {
            qc->coef=qb->coef;
            qc->expn=qb->expn;
            qb=qb->next; 
        }
        //在多项式有值的情况下,将值传给pc,带出
        //但是pc又等于headc,由于是指针,就会同样改变headc的值,结果就再转换成由headc带出 
        if(qc->coef!=0)
        {
            qc->next=qc->next;
            pc->next=qc;
            pc=qc;
        }
        //多项式没有值,要么没输入,要么输入错误,自动释放空间,无返回值 
        else
        free(qc);
     }
     //这里指的是第一个多项式 pa 中有的多项式,但第一个多项式 pb 中没有的,不用这个循环会漏掉 
     while(qa !=NULL)//pa中如果有剩余,将余项插入到PC中 
     {
         qc=(Polynomial*)malloc(sizeof(Polynomial));
         qc->coef=qa->coef;
         qc->expn=qa->expn;
         qa=qa->next;
         qc->next=pc->next;
         pc->next=qc;
         pc=qc;
      } 
      //这里指的是第二个多项式 pb 中有的多项式,但第一个多项式 pa 中没有的,不用这个循环会漏掉
      while(qb!=NULL)//pb如果有剩余,将剩余项插入到pc中
      {
         qc=(Polynomial*)malloc(sizeof(Polynomial));
         qc->coef=qb->coef;
         qc->expn=qb->expn;
         qb=qb->next;
         qc->next=pc->next;
         pc->next=qc;
         pc=qc;          
       } 
       qc->next=NULL;
       return headc;
  } 
  //两个多项式相减
 Polynomial *SubtractPolyn(Polynomial *pa,Polynomial *pb)
 {
     Polynomial *h=pb;
     Polynomial *p=pb->next;
     Polynomial *pd;
     while(p)
     {
         p->coef*=-1;
         p=p->next;
     }
     pd=AddPolyn(pa,h);//调用了两个多项式相加 
     for(p=h->next;p;p=p->next)
     p->coef*=-1;
     return pd;
   }
   //乘法运算 
Polynomial *MulPolyn(Polynomial *pa,Polynomial *pb)
{
    Polynomial *qa=pa->next;
    Polynomial *qb=pb->next;
    Polynomial *headc,*pc,*qc;
    pc=( Polynomial *)malloc(sizeof( Polynomial));
    pc->next=NULL;
    headc=pc;
    while(qa!=NULL)
    {
    while(qb!=NULL)
    {
        qc=(Polynomial *)malloc(sizeof( Polynomial));
        qc->coef=(qa->coef)*(qb->coef);
        qc->expn=(qa->expn)+(qb->expn);
        qb=qb->next;
        qc->next=pc->next;
        pc->next=qc;//qc的指数和系数都还在qc中,所以把qc赋值给pc的next结点,因为pc本身为空,就是用来装新的数据的
        pc=qc; 
    }
    qa=qa->next;
    if(qa!=NULL)
    qb=pb->next; 
}
pc=qc;//pc同步qc,将首地址传给pc 
qc->next=NULL;
return headc;//pc同步headc,由headc传出首地址 
}

int main()
{
    Polynomial *q3;
    Polynomial *q4;
    Polynomial *q5;
    int num=1;
    printf("请输入你的选项:\n");
    printf("0.退出!\n"); 
    printf("1.建立多项式\n");
    printf("2.多项式相加\n");
    printf("3.多项式相减\n");
    printf("4.输出多项式\n");
    printf("5.多项式相乘\n");
    while(num!=0)
    {
        printf("请输入你的指令:");
        scanf("%d",&num);
        switch(num)
        {
            case 0:num=0;
            break;
            case 1:
            printf("系数与指数之间用逗号隔开\n");
            printf("0表示结束输入\n");
            
            printf("请输入建立的第一个多项式:");
            Polynomial *q1=CreatePoly();
            printf("请输入建立的第二个多项式:");
            Polynomial *q2=CreatePoly();
            break;
            case 2:q3=AddPolyn(q1,q2);
            printf("两个多项式相加的结果为:\n");
            PrintPolyn(q3);
            break;
            case 3:q4=SubtractPolyn(q1,q2);
            printf("两个多项式相减的结果为:\n");
            PrintPolyn(q4);
            break;
            case 4:printf("多项式1:\n");
            PrintPolyn(q1);
            printf("多项式2:\n");
            PrintPolyn(q2);
            break;
            case 5:q5=MulPolyn(q1,q2);
            printf("两个多项式相乘的结果为:\n");
            PrintPolyn(q5);
            break;
            default:printf("指令错误!请重输:\n");
            break;    
        }
    }
}

 

posted @ 2022-06-21 17:01  回忆也交给时间  阅读(148)  评论(0编辑  收藏  举报