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

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

c

1个回答

#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");
  }
 }
}


运行效果图如下:

图片说明

qq_1821598331
qq_1821598331 可以了,谢谢!
12 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!