一元多项式的相加和相乘

typedef struct Lnode{
    int coef;  // xishu
    int expon;  // zhishu
    struct Lnode *next;
}Lnode,*Link;

读取函数:

void insert(Link &L){
    int n; Link end,p;
    end=L;
    printf("请输入需要输入的项数:");
    scanf("%d",&n);
    while(n--){
            p=(Link)malloc(sizeof(Lnode));
        scanf("%d",&p->coef);
        scanf("%d",&p->expon);
        end->next=p;
        end = p;
    }
    end->next=NULL;

}/*void attach (int c,int e,Link end ){
    Link p;
    p=(Link)malloc(sizeof(Lnode));
    p->coef=c;
    p->expon=e;
    p->next=NULL;
    end->next=p;
    end = p;
}*/

加法函数:

void add(Link &p1,Link &p2,Link &p3){  //p3带有头结点

        Link pa,pb,pc,p;
        pa=p1->next;  pb=p2->next;
        pc=(Link)malloc(sizeof(Lnode));  // 为方便表头插入,先产生一个临时空节点
        p3=pc;
        while(pa&&pb){
        if(pa->expon>pb->expon){
         p=(Link)malloc(sizeof(Lnode));
           p->coef=pa->coef; p->expon=pa->expon;
           p->next=NULL;  pc->next=p; pc=p;
            pa=pa->next;
        }
        else if(pa->expon<pb->expon){
         p=(Link)malloc(sizeof(Lnode));
           p->coef=pb->coef; p->expon=pb->expon;
           p->next=NULL;  pc->next=p; pc=p;
           pb=pb->next;
           }
           else{
             p=(Link)malloc(sizeof(Lnode));
           p->coef=pb->coef+pa->coef; p->expon=pb->expon;
           p->next=NULL;  pc->next=p; pc=p;
           pa=pa->next;
           pb=pb->next;
           }
        }
        pc->next=pa?pa:pb;
}

乘法函数:

void mult(Link &s,Link p1,Link p2){
    Link p,rear,t1,t2,t;
    t1=p1->next; t2=p2->next;
    int c,e;
    rear=s;
    while(t2){
            p=(Link)malloc(sizeof(Lnode));
        p->coef=t1->coef*t2->coef;
        p->expon=t1->expon+t2->expon; p->next=NULL;
        rear->next=p;
        rear = p;
        t2=t2->next;
    }  // 先用p1的第一项乘以p2,然后在逐个插入进去
    t1=t1->next;
    while(t1){              //循环嵌套
        t2=p2->next;  rear=s;
        while(t2){e=t1->expon+t2->expon;
              c=t1->coef+t1->coef;
              while(rear->next&&rear->next->expon>e)  rear=rear->next;    //这里就开始进行逐个插入,先比较指数,直到比较出小于e,
              if(rear->next->expon==e){                             // 判断指数是相等还是大于  ,若相等就比较系数的值,不相等就插入
                if(rear->next->coef+c)  rear->next->coef+=c;
                else{
                    t=rear->next;
                    rear->next=t->next;  free(t);
                }
              }
             else{
                p=(Link)malloc(sizeof(Lnode));
                p->coef=c;  p->expon=e;
                p->next=rear->next;rear->next=p;
                rear=rear->next;
             }
        }
    }
}

整体函数为:

#include<stdio.h>
#include<stdlib.h>
typedef struct Lnode{
    int coef;  // xishu
    int expon;  // zhishu
    struct Lnode *next;
}Lnode,*Link;
void initial(Link &L){
        L=(Link)malloc(sizeof(Lnode));
        L->next=NULL;
}
void insert(Link &L){
    int n; Link end,p;
    end=L;
    printf("请输入需要输入的项数:");
    scanf("%d",&n);
    while(n--){
            p=(Link)malloc(sizeof(Lnode));
        scanf("%d",&p->coef);
        scanf("%d",&p->expon);
        end->next=p;
        end = p;
    }
    end->next=NULL;

}/*void attach (int c,int e,Link end ){
    Link p;
    p=(Link)malloc(sizeof(Lnode));
    p->coef=c;
    p->expon=e;
    p->next=NULL;
    end->next=p;
    end = p;
}*/


 void print(Link L){
    Link tem=L->next;
    int flag=1;
    while(tem){
        if(flag)   flag=0;
        else printf(" ");
        printf("%d %d",tem->coef,tem->expon);
        tem=tem->next;
    }
    printf("\n");
 }
 /*void bianli(Link L){
    Link p;
    p=L->next;
    if(p->coef<0)  printf("  - ");
        printf("%dx^%d",p->coef,p->expon);
    p=p->next;
   do{
        if(p->coef>0)  printf(" + ");
    printf("%d^%d",p->coef,p->expon);
     p=p->next;
   }while(p!=NULL);

 } */
void add(Link &p1,Link &p2,Link &p3){  //p3带有头结点

        Link pa,pb,pc,p;
        pa=p1->next;  pb=p2->next;
        pc=(Link)malloc(sizeof(Lnode));  // 为方便表头插入,先产生一个临时空节点
        p3=pc;
        while(pa&&pb){
        if(pa->expon>pb->expon){
         p=(Link)malloc(sizeof(Lnode));
           p->coef=pa->coef; p->expon=pa->expon;
           p->next=NULL;  pc->next=p; pc=p;
            pa=pa->next;
        }
        else if(pa->expon<pb->expon){
         p=(Link)malloc(sizeof(Lnode));
           p->coef=pb->coef; p->expon=pb->expon;
           p->next=NULL;  pc->next=p; pc=p;
           pb=pb->next;
           }
           else{
             p=(Link)malloc(sizeof(Lnode));
           p->coef=pb->coef+pa->coef; p->expon=pb->expon;
           p->next=NULL;  pc->next=p; pc=p;
           pa=pa->next;
           pb=pb->next;
           }
        }
        pc->next=pa?pa:pb;
}
void mult(Link &s,Link p1,Link p2){
    Link p,rear,t1,t2,t;
    t1=p1->next; t2=p2->next;
    int c,e;
    rear=s;
    while(t2){
            p=(Link)malloc(sizeof(Lnode));
        p->coef=t1->coef*t2->coef;
        p->expon=t1->expon+t2->expon; p->next=NULL;
        rear->next=p;
        rear = p;
        t2=t2->next;
    }  // 先用p1的第一项乘以p2
    t1=t1->next;
    while(t1){
        t2=p2->next;  rear=s;
        while(t2){e=t1->expon+t2->expon;
              c=t1->coef+t1->coef;
              while(rear->next&&rear->next->expon>e)  rear=rear->next;
              if(rear->next->coef==e){
                if(rear->next->coef+c)  rear->next->coef+=c;
                else{
                    t=rear->next;
                    rear->next=t->next;  free(t);
                }
              }
             else{
                p=(Link)malloc(sizeof(Lnode));
                p->coef=c;  p->expon=e;
                p->next=rear->next;rear->next=p;
                rear=rear->next;
             }
        }
    }
}

main(){
        Link a,b,c,d;
        initial(a);
        initial(b);
        insert(a);
        print(a);

        insert(b);
        print(b);
        add(a,b,c);
        print(c);
        mult(d,a,b);
        print(d);
}

 



 

posted @ 2019-04-17 16:51  小七啊  阅读(378)  评论(0编辑  收藏  举报