qq_1821598331 2018-09-23 13:49 采纳率: 0%
浏览 814

本人新手,求一个简单的一元稀疏多项式计算器,只要求加减就行,求大佬帮忙,急!?

要求如下:
1.输入并建立多项式;
2.能按照类数学表达式的形式输出结果,如,多项式-3x⁴+1输出形式为-3x^4+1序列按指数降序排列。
3.多项式a和b相加
4.多项式a和b相减

  • 写回答

1条回答 默认 最新

  • qq_43166840 2018-09-23 14:43
    关注
    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>
    #include<malloc.h>
    #define maxlen 10
    #define large 999
    typedef struct Linklistomial{
        float coef;
        int expn;
        struct Linklistomial *next;
    }Linklistomial,*Linklist;
    void Insert(Linklist p,Linklist h){     
        if(p->coef==0) free(p);//系数为0的话释放结点
        else
     {
            Linklist q1,q2;
            q1=h;
      q2=h->next;
            while(q2&&p->expn<q2->expn) {   //查找插入位置
                q1=q2;
                q2=q2->next;
      }
            if(q2&&p->expn==q2->expn) {    //将指数相同相合并
                q2->coef+=p->coef;
                free(p);
                if(!q2->coef) {//系数为0的话释放结点
                    q1->next=q2->next;
                    free(q2);
     }
      }
            else {    //指数为新时将结点插入
                p->next=q2;
                q1->next=p;   }
     }
    }
    Linklist CreateLinklist(Linklist head,int m){
     //建立一个头指针为head、项数为m的一元多项式
        int i;
        Linklist p;
        p=head=(Linklist)malloc(sizeof(struct Linklistomial));
        head->next=NULL;
        for(i=0;i<m;i++) {
            p=(Linklist)malloc(sizeof(struct Linklistomial));//建立新结点以接收数据
            printf("请输入第%d项的系数与指数:",i+1);
            scanf("%f %d",&p->coef,&p->expn);
            Insert(p,head);   //调用Insert函数插入结点
     }
        return head;
    }
    void DestroyLinklist(Linklist p){     //销毁多项式p
        Linklist q1,q2;
        q1=p->next;      q2=q1->next;
        while(q1->next)   {
            free(q1);
            q1=q2;
            q2=q2->next; }
    }
    void PrintLinklist(Linklist P){
     Linklist q=P->next; 
        int flag=1;   //项数计数器
        if(!q)  {     //若多项式为空,输出0
            putchar('0'); 
            printf("\n");
            return;
     }   
        while(q)
     {
            if(q->coef>0&&flag!=1) putchar('+'); //系数大于0且不是第一项
            if(q->coef!=1&&q->coef!=-1)   {    //系数非1或-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");
    }
    int compare(Linklist a,Linklist b){
        if(a&&b)
     {      if(!b||a->expn>b->expn) return 1;
            else if(!a||a->expn<b->expn) return -1;
            else return 0;
     }
        else if(!a&&b) return -1;//a多项式已空,但b多项式非空
        else return 1;//b多项式已空,但a多项式非空
    }
    Linklist AddLinklist(Linklist pa,Linklist pb){//求解并建立多项式a+b,返回其头指针
        Linklist qa=pa->next;
        Linklist qb=pb->next;
        Linklist headc,hc,qc;
        hc=(Linklist)malloc(sizeof(struct Linklistomial));//建立头结点
        hc->next=NULL;
        headc=hc;
        while(qa||qb)
     {
            qc=(Linklist)malloc(sizeof(struct Linklistomial));
            switch(compare(qa,qb)){
            case 1:  {
                    qc->coef=qa->coef;
                    qc->expn=qa->expn;
                    qa=qa->next;
                    break;    }
            case 0: { 
                    qc->coef=qa->coef+qb->coef;
                    qc->expn=qa->expn;
                    qa=qa->next;
                    qb=qb->next;
                    break;
                               }
            case -1: {
                    qc->coef=qb->coef;
                    qc->expn=qb->expn;
                    qb=qb->next;
                    break;    } 
      }
            if(qc->coef!=0)
      {
                qc->next=hc->next;
                hc->next=qc;
                hc=qc;
      }
        else free(qc);//当相加系数为0时,释放该结点
     }
        return headc;
    }
    Linklist SubLinklist(Linklist pa,Linklist pb){//求解并建立多项式a-b,返回其头指针
        Linklist qa=pa->next;
        Linklist qb=pb->next;
        Linklist headc,hc,qc;
        hc=(Linklist)malloc(sizeof(struct Linklistomial));//建立头结点
        hc->next=NULL;
        headc=hc;
        while(qa||qb)
     {
            qc=(Linklist)malloc(sizeof(struct Linklistomial));
            switch(compare(qa,qb)){
            case 1:  {
                    qc->coef=qa->coef;
                    qc->expn=qa->expn;
                    qa=qa->next;
                    break;    }
            case 0: { 
                    qc->coef=qa->coef-qb->coef;
                    qc->expn=qa->expn;
                    qa=qa->next;
                    qb=qb->next;
                    break;
                               }
            case -1: {
                    qc->coef=qb->coef;
                    qc->expn=qb->expn;
                    qb=qb->next;
                    break;    } 
      }
            if(qc->coef!=0)
      {
                qc->next=hc->next;
                hc->next=qc;
                hc=qc;
      }
        else free(qc);//当相减系数为0时,释放该结点
     }
        return headc;
    }
    
    
    int main()
    {    int m,n,a=1;
         float x;
         char flag;
        Linklist pa=0,pb=0,pc;
        printf("请输入a的项数:");
        scanf("%d",&m);
        pa=CreateLinklist(pa,m);//建立多项式a
        printf("请输入b的项数:");
        scanf("%d",&n);
        pb=CreateLinklist(pb,n);//建立多项式
        //输出菜单
     printf("   *******************************************************\n");
     printf("   *                                                     *\n");
     printf("   *       a:输出多项式a            b:输出多项式b        *\n");
     printf("   *                                                     *\n");
     printf("   *       c: 输出a+b               d:输出a-b            *\n");
     printf("   *                                                     *\n");
     printf("   *******************************************************\n");
     while(a)
     {
            printf("\n请选择操作:");
            scanf(" %c",&flag);//空格符号一定要注意
      switch(flag)
      {    case'a':
          {
               printf("\n       多项式a=");
               PrintLinklist(pa);
               break; }
          case'b':
        {
            printf("\n       多项式b=");
            PrintLinklist(pb);
            break;   }
    
       case'c':  {
            pc=AddLinklist(pa,pb);
                        printf("\n       a+b=");
            PrintLinklist(pc);
            break;
    }
        case'd':  {
            pc=SubLinklist(pa,pb);
                        printf("\n       a-b=");
            PrintLinklist(pc);
            break;
    }
    
                default:
        printf("\n       您的选择错误,请重新选择!\n");
      }
     }
    }
    
    
    

    运行效果图如下:

    图片说明

    评论

报告相同问题?

悬赏问题

  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗