码迷,mamicode.com
首页 > 其他好文 > 详细

链表实现多项式加法

时间:2016-03-13 22:18:37      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

#include<stdio.h>
#include<stdlib.h>
typedef struct Polynode*Polynomial;
struct Polynode{
    int coef;
    int expon;
    Polynomial link;
};
int Compare(int e1,int e2);
void attach(int c,int e,Polynomial*reat);
Polynomial ReadPoly();
Polynomial add(Polynomial P1,Polynomial P2);
void PrintPoly(Polynomial P);
int main(){
    Polynomial P1,P2,PP;
    P1=    ReadPoly();
    P2=ReadPoly();
    PP=add(P1,P2);
    PrintPoly(PP);
    return 0;
}
int Compare(int e1,int e2){
    if(e1>e2) return 1;
    else if(e1<e2) return -1;
    else return 0;
}
void attach(int c,int e,Polynomial*reat){
    Polynomial P;
    P=(Polynomial)malloc(sizeof(struct Polynode));
    P->coef=c;
    P->expon=e;
    P->link=NULL;
    (*reat)->link=P;
    *reat=P;
}
Polynomial ReadPoly(){
    int N,c,e;
    Polynomial P,rear,t;
    P=(Polynomial)malloc(sizeof(struct Polynode));
    P->link=NULL;
    rear=P;
    scanf("%d",&N);
    while(N--){
        scanf("%d %d",&c,&e);
        attach(c,e,&rear);
    }
    t=P;P=P->link;free(t);
    return P;
}
Polynomial add(Polynomial P1,Polynomial P2){
    int sum;
    Polynomial front,rear,temp;
    front=(Polynomial)malloc(sizeof(struct Polynode));
    rear=front;
    while(P1&&P2){
        switch (Compare(P1->expon,P2->expon)){
        case 1:
            attach(P1->coef,P1->expon,&rear);
            P1=P1->link;
            break;
        case -1:
            attach(P2->coef,P2->expon,&rear);
            P2=P2->link;
            break;
        case 0:
            sum=P1->coef+P2->coef;
            attach(sum,P1->expon,&rear);
            P1=P1->link;
            P2=P2->link;
            break;
        }
    }
    for(;P1;P1=P1->link)attach(P1->coef,P1->expon,&rear);
    for(;P2;P2=P2->link)attach(P2->coef,P2->expon,&rear);
    rear->link=NULL;
    temp=front;
    front=front->link;
    free(temp);
    return front;
}
void PrintPoly(Polynomial P){
    int flag=0;
    if(!P){
        printf("0 0\n");
        return;
    }
    while(P){
        if(!flag)
            flag=1;
        else
            printf(" ");
        printf("%d %d",P->coef,P->expon);
        P=P->link;
    }
}

特别注意attach这个函数:

void attach(int c,int e,Polynomial*reat){
    Polynomial P;
    P=(Polynomial)malloc(sizeof(struct Polynode));
    P->coef=c;
    P->expon=e;
    P->link=NULL;
    (*reat)->link=P;
    *reat=P;
}

其中一个参数Polynomial*reat,使用的地址的地址,如果是只用Polynomial型,那么相当于只是传递进来一个地址值,函数调用完后就会释放掉形参的地址,因此链表的尾部不会变化,因此需要用Polynomial*reat类型。

链表实现多项式加法

标签:

原文地址:http://www.cnblogs.com/jinfuweng/p/5273296.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!