菜鳥之路--線性表__多項式操作(多項式加減乘)

/*
<span style="font-size:18px;">代碼裏的使用的鏈表請見<a target=_blank href="http://blog.csdn.net/u013303425/article/details/41320861"> http://blog.csdn.net/u013303425/article/details/41320861</a></span>
*/
#include<stdio.h>
#include<stdlib.h>
#include "Link.h"
typedef LinkList Polynominal;
typedef struct{
    float coef;
    int expn;
} term,ElemType;
Status CreatePolyn(Polynominal **poly,int m){
    if(!InitList(poly)) return ERROR;
    ElemType e;
    Link * p;
    for(int i=0;i<m;i++){
        scanf("%f-%d",&e.coef,&e.expn);
        MakeNode(&p,e);
        Append(*poly,p);
    }
    return OK;
}
Status DestroyPoly(Polynominal *poly){
    DestroyList(poly);
    return OK;
}
void PrintPoly(Polynominal *poly){
    //printf("%x",poly);
    Link * temp = poly->head->next;
    while(temp){
        printf(" %0.2fx^%d ",temp->data.coef,temp->data.expn);
        if(temp->next != NULL && temp->next->data.coef >0.0){
            printf("+");
        }
        temp = temp->next;
    }
    printf("\n");
}
int PolyLength(Polynominal *poly){
    return ListLength(poly);
}
void AddPoly(Polynominal *poly1,Polynominal *poly2,int (* compare)(ElemType,ElemType)){
    //將poly2 合併到Poly1中
    Link *ha,*hb,*pa,*pb;
    ha  = poly1->head;
    hb  = poly2->head;
    pa  = NextPos(poly1,ha);
    pb  = NextPos(poly2,hb);
    while(pa && pb){

        if((*compare)(pa->data,pb->data) == 1){ //pa->data.expn > pb->data.expn
            DelFirst(poly2,hb,pb); InsBefore(poly1,pa,pb); pb= NextPos(poly2,hb);
        }else if((*compare)(pa->data,pb->data) == 0){
            DelFirst(poly2,hb,pb);
            pa->data.coef += pb->data.coef;
            Link * tempprior = PriorPos(poly1,pa);
            Link * tempnext = NextPos(poly1,pa);
            if(pa->data.coef == 0){
                FreeNode(poly1,&pa);
                tempprior->next = tempnext;
            }
            FreeNode(poly2,&pb);
            pa = tempnext;
            pb = NextPos(poly2,hb);
        }else{
            pa= NextPos(poly2,pa);
        }

    }
    if(pb !=NULL){Append(poly1,pb);}
    free(hb);
}
void SubtractPoly(Polynominal *poly1,Polynominal *poly2,int (* compare)(ElemType,ElemType)){
    Link *ha,*hb,*pa,*pb;
    ha  = poly1->head;
    hb  = poly2->head;
    pa  = NextPos(poly1,ha);
    pb  = NextPos(poly2,hb);
    while(pa && pb){
        if((*compare)(pa->data,pb->data) == 1){ //pa->data.expn > pb->data.expn
            DelFirst(poly2,hb,pb); pb->data.coef = -pb->data.coef; InsBefore(poly1,pa,pb); pb= NextPos(poly2,hb);
        }else if((*compare)(pa->data,pb->data) == 0){
            DelFirst(poly2,hb,pb);
            pa->data.coef -= pb->data.coef;
            Link * tempprior = PriorPos(poly1,pa);
            Link * tempnext = NextPos(poly1,pa);
            if(pa->data.coef == 0){
                FreeNode(poly1,&pa);
                tempprior->next = tempnext;
            }
            FreeNode(poly2,&pb);
            pa = tempnext;
            pb = NextPos(poly2,hb);
        }else{
            pa= NextPos(poly2,pa);
        }
    }
    while(pb){
        DelFirst(poly2,hb,pb);
        pb->data.coef = -pb->data.coef;
        Append(poly1,pb);
        pb=NextPos(poly2,pb);
    }
    free(hb);
}
void Multip(Polynominal *poly1,Polynominal *poly2,Polynominal *poly3){
   //將poly1和Poly2相乘的結果保存到poly3中
    Link *pa,*pb;
    pb  = NextPos(poly2,poly2->head);
    ElemType etemp;
    Link * temp = NULL;
    while(pb){
        pa  = NextPos(poly1,poly1->head);
        while(pa){
            etemp.coef = pa->data.coef * pb->data.coef;
            etemp.expn = pa->data.expn + pb->data.expn;
            MakeNode(&temp,etemp);
            Append(poly3,temp);
            pa = NextPos(poly1,pa);
            //FreeNode(poly1,&temp);
        }
        pb = NextPos(poly2,pb);
    }
}
int compare(ElemType e1,ElemType e2){
    if(e1.expn>e2.expn){
        return 1;
    }else if(e1.expn==e2.expn){
        return 0;
    }else{
        return -1;
    }
}
int main(){
    Polynominal *poly1=NULL;
    Polynominal *poly2=NULL;
    Polynominal *poly3=NULL;
    InitList(&poly3);
    CreatePolyn(&poly1,2);
    printf("多項式1:");
    PrintPoly(poly1);
    CreatePolyn(&poly2,2);
    printf("多項式2:");
    PrintPoly(poly2);
    //SubtractPoly(poly1,poly2,compare);
    //printf("合併後的多項式:");
    //PrintPoly(poly1);
    Multip(poly1,poly2,poly3);
    printf("相乘後的多項式");
    PrintPoly(poly3);
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章